234 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			234 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef DATE_TIME_DATE_FORMATTING_LOCALES_HPP___
							 | 
						||
| 
								 | 
							
								#define DATE_TIME_DATE_FORMATTING_LOCALES_HPP___
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
							 | 
						||
| 
								 | 
							
								 * Use, modification and distribution is subject to the
							 | 
						||
| 
								 | 
							
								 * Boost Software License, Version 1.0. (See accompanying
							 | 
						||
| 
								 | 
							
								 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								 * Author: Jeff Garland, Bart Garst
							 | 
						||
| 
								 | 
							
								 * $Date$
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "boost/date_time/locale_config.hpp" // set BOOST_DATE_TIME_NO_LOCALE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_DATE_TIME_NO_LOCALE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "boost/date_time/iso_format.hpp"
							 | 
						||
| 
								 | 
							
								#include "boost/date_time/date_names_put.hpp"
							 | 
						||
| 
								 | 
							
								#include "boost/date_time/parse_format_base.hpp"
							 | 
						||
| 
								 | 
							
								//#include <string>
							 | 
						||
| 
								 | 
							
								#include <sstream>
							 | 
						||
| 
								 | 
							
								#include <iomanip>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace date_time {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //! Formats a month as as string into an ostream
							 | 
						||
| 
								 | 
							
								  template<class facet_type,
							 | 
						||
| 
								 | 
							
								           class charT = char>
							 | 
						||
| 
								 | 
							
								  class ostream_month_formatter
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    typedef typename facet_type::month_type month_type;
							 | 
						||
| 
								 | 
							
								    typedef std::basic_ostream<charT> ostream_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //! Formats a month as as string into an output iterator
							 | 
						||
| 
								 | 
							
								    static void format_month(const month_type& month,
							 | 
						||
| 
								 | 
							
								                             ostream_type& os,
							 | 
						||
| 
								 | 
							
								                             const facet_type& f)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      switch (f.month_format())
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        case month_as_short_string:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          std::ostreambuf_iterator<charT> oitr(os);
							 | 
						||
| 
								 | 
							
								          f.put_month_short(oitr, month.as_enum());
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case month_as_long_string:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          std::ostreambuf_iterator<charT> oitr(os);
							 | 
						||
| 
								 | 
							
								          f.put_month_long(oitr, month.as_enum());
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case month_as_integer:
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          charT fill_char = '0';
							 | 
						||
| 
								 | 
							
								          os << std::setw(2) << std::setfill(fill_char) << month.as_number();
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } // format_month
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //! Formats a weekday
							 | 
						||
| 
								 | 
							
								  template<class weekday_type,
							 | 
						||
| 
								 | 
							
								           class facet_type,
							 | 
						||
| 
								 | 
							
								           class charT = char>
							 | 
						||
| 
								 | 
							
								  class ostream_weekday_formatter
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    typedef typename facet_type::month_type month_type;
							 | 
						||
| 
								 | 
							
								    typedef std::basic_ostream<charT> ostream_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //! Formats a month as as string into an output iterator
							 | 
						||
| 
								 | 
							
								    static void format_weekday(const weekday_type& wd,
							 | 
						||
| 
								 | 
							
								                               ostream_type& os,
							 | 
						||
| 
								 | 
							
								                               const facet_type& f,
							 | 
						||
| 
								 | 
							
								                               bool  as_long_string)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      std::ostreambuf_iterator<charT> oitr(os);
							 | 
						||
| 
								 | 
							
								      if (as_long_string) {
							 | 
						||
| 
								 | 
							
								        f.put_weekday_long(oitr, wd.as_enum());
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else {
							 | 
						||
| 
								 | 
							
								        f.put_weekday_short(oitr, wd.as_enum());
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    } // format_weekday
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //! Convert ymd to a standard string formatting policies
							 | 
						||
| 
								 | 
							
								  template<class ymd_type,
							 | 
						||
| 
								 | 
							
								           class facet_type,
							 | 
						||
| 
								 | 
							
								           class charT = char>
							 | 
						||
| 
								 | 
							
								  class ostream_ymd_formatter
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    typedef typename ymd_type::month_type month_type;
							 | 
						||
| 
								 | 
							
								    typedef ostream_month_formatter<facet_type, charT> month_formatter_type;
							 | 
						||
| 
								 | 
							
								    typedef std::basic_ostream<charT> ostream_type;
							 | 
						||
| 
								 | 
							
								    typedef std::basic_string<charT> foo_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //! Convert ymd to a standard string formatting policies
							 | 
						||
| 
								 | 
							
								    /*! This is standard code for handling date formatting with
							 | 
						||
| 
								 | 
							
								     *  year-month-day based date information.  This function
							 | 
						||
| 
								 | 
							
								     *  uses the format_type to control whether the string will
							 | 
						||
| 
								 | 
							
								     *  contain separator characters, and if so what the character
							 | 
						||
| 
								 | 
							
								     *  will be.  In addtion, it can format the month as either
							 | 
						||
| 
								 | 
							
								     *  an integer or a string as controled by the formatting
							 | 
						||
| 
								 | 
							
								     *  policy
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    //     static string_type ymd_to_string(ymd_type ymd)
							 | 
						||
| 
								 | 
							
								//     {
							 | 
						||
| 
								 | 
							
								//       std::ostringstream ss;
							 | 
						||
| 
								 | 
							
								//       facet_type dnp;
							 | 
						||
| 
								 | 
							
								//       ymd_put(ymd, ss, dnp);
							 | 
						||
| 
								 | 
							
								//       return ss.str();
							 | 
						||
| 
								 | 
							
								//       }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Put ymd to ostream -- part of ostream refactor
							 | 
						||
| 
								 | 
							
								    static void ymd_put(ymd_type ymd,
							 | 
						||
| 
								 | 
							
								                        ostream_type& os,
							 | 
						||
| 
								 | 
							
								                        const facet_type& f)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      std::ostreambuf_iterator<charT> oitr(os);
							 | 
						||
| 
								 | 
							
								      charT fill_char = '0';
							 | 
						||
| 
								 | 
							
								      switch (f.date_order()) {
							 | 
						||
| 
								 | 
							
								        case ymd_order_iso: {
							 | 
						||
| 
								 | 
							
								          os << ymd.year;
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								            f.month_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          month_formatter_type::format_month(ymd.month, os, f);
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								            f.day_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          os  << std::setw(2) << std::setfill(fill_char)
							 | 
						||
| 
								 | 
							
								              << ymd.day;
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case ymd_order_us: {
							 | 
						||
| 
								 | 
							
								          month_formatter_type::format_month(ymd.month, os, f);
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								          f.day_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          os  << std::setw(2) << std::setfill(fill_char)
							 | 
						||
| 
								 | 
							
								            << ymd.day;
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								            f.month_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          os << ymd.year;
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        case ymd_order_dmy: {
							 | 
						||
| 
								 | 
							
								          os  << std::setw(2) << std::setfill(fill_char)
							 | 
						||
| 
								 | 
							
								              << ymd.day;
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								            f.day_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          month_formatter_type::format_month(ymd.month, os, f);
							 | 
						||
| 
								 | 
							
								          if (f.has_date_sep_chars()) {
							 | 
						||
| 
								 | 
							
								            f.month_sep_char(oitr);
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          os << ymd.year;
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //! Convert a date to string using format policies
							 | 
						||
| 
								 | 
							
								  template<class date_type,
							 | 
						||
| 
								 | 
							
								           class facet_type,
							 | 
						||
| 
								 | 
							
								           class charT = char>
							 | 
						||
| 
								 | 
							
								  class ostream_date_formatter
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    typedef std::basic_ostream<charT> ostream_type;
							 | 
						||
| 
								 | 
							
								    typedef typename date_type::ymd_type ymd_type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //! Put date into an ostream
							 | 
						||
| 
								 | 
							
								    static void date_put(const date_type& d,
							 | 
						||
| 
								 | 
							
								                         ostream_type& os,
							 | 
						||
| 
								 | 
							
								                         const facet_type& f)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      special_values sv = d.as_special();
							 | 
						||
| 
								 | 
							
								      if (sv == not_special) {
							 | 
						||
| 
								 | 
							
								        ymd_type ymd = d.year_month_day();
							 | 
						||
| 
								 | 
							
								        ostream_ymd_formatter<ymd_type, facet_type, charT>::ymd_put(ymd, os, f);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else { // output a special value
							 | 
						||
| 
								 | 
							
								        std::ostreambuf_iterator<charT> coi(os);
							 | 
						||
| 
								 | 
							
								        f.put_special_value(coi, sv);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    //! Put date into an ostream
							 | 
						||
| 
								 | 
							
								    static void date_put(const date_type& d,
							 | 
						||
| 
								 | 
							
								                         ostream_type& os)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      //retrieve the local from the ostream
							 | 
						||
| 
								 | 
							
								      std::locale locale = os.getloc();
							 | 
						||
| 
								 | 
							
								      if (std::has_facet<facet_type>(locale)) {
							 | 
						||
| 
								 | 
							
								        const facet_type& f = std::use_facet<facet_type>(locale);
							 | 
						||
| 
								 | 
							
								        date_put(d, os, f);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else {
							 | 
						||
| 
								 | 
							
								        //default to something sensible if no facet installed
							 | 
						||
| 
								 | 
							
								        facet_type default_facet;
							 | 
						||
| 
								 | 
							
								        date_put(d, os, default_facet);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } // date_to_ostream 
							 | 
						||
| 
								 | 
							
								  }; //class date_formatter
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} } //namespace date_time
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 |