✅ added test with thousands_sep
This commit is contained in:
		
							parent
							
								
									5b53f03e7c
								
							
						
					
					
						commit
						4151f2d297
					
				
					 3 changed files with 20 additions and 48 deletions
				
			
		
							
								
								
									
										21
									
								
								src/json.hpp
									
										
									
									
									
								
							
							
						
						
									
										21
									
								
								src/json.hpp
									
										
									
									
									
								
							|  | @ -8298,25 +8298,7 @@ class basic_json | |||
| 
 | ||||
|             snprintf(m_buf.data(), m_buf.size(), fmt, x); | ||||
| 
 | ||||
| #if 0 | ||||
|             // C locales and C++ locales are similar but
 | ||||
|             // different.
 | ||||
|             //
 | ||||
|             // If working with C++ streams we'd've used
 | ||||
|             // these, but for C formatting functions we
 | ||||
|             // have to use C locales (setlocale / localeconv),
 | ||||
|             // rather than C++ locales (std::locale installed
 | ||||
|             // by std::locale::global()).
 | ||||
|             const std::locale loc; | ||||
| 
 | ||||
|             const char thousands_sep = | ||||
|                 std::use_facet< std::numpunct<char>>( | ||||
|                     loc).thousands_sep(); | ||||
| 
 | ||||
|             const char decimal_point = | ||||
|                 std::use_facet< std::numpunct<char>>( | ||||
|                     loc).decimal_point(); | ||||
| #else | ||||
|             // read information from locale
 | ||||
|             const auto loc = localeconv(); | ||||
|             assert(loc != nullptr); | ||||
|             const char thousands_sep = !loc->thousands_sep ? '\0' | ||||
|  | @ -8324,7 +8306,6 @@ class basic_json | |||
| 
 | ||||
|             const char decimal_point = !loc->decimal_point ? '\0' | ||||
|                                        : loc->decimal_point[0]; | ||||
| #endif | ||||
| 
 | ||||
|             // erase thousands separator
 | ||||
|             if (thousands_sep != '\0') | ||||
|  |  | |||
|  | @ -8298,25 +8298,7 @@ class basic_json | |||
| 
 | ||||
|             snprintf(m_buf.data(), m_buf.size(), fmt, x); | ||||
| 
 | ||||
| #if 0 | ||||
|             // C locales and C++ locales are similar but | ||||
|             // different. | ||||
|             // | ||||
|             // If working with C++ streams we'd've used | ||||
|             // these, but for C formatting functions we | ||||
|             // have to use C locales (setlocale / localeconv), | ||||
|             // rather than C++ locales (std::locale installed | ||||
|             // by std::locale::global()). | ||||
|             const std::locale loc; | ||||
| 
 | ||||
|             const char thousands_sep = | ||||
|                 std::use_facet< std::numpunct<char>>( | ||||
|                     loc).thousands_sep(); | ||||
| 
 | ||||
|             const char decimal_point = | ||||
|                 std::use_facet< std::numpunct<char>>( | ||||
|                     loc).decimal_point(); | ||||
| #else | ||||
|             // read information from locale | ||||
|             const auto loc = localeconv(); | ||||
|             assert(loc != nullptr); | ||||
|             const char thousands_sep = !loc->thousands_sep ? '\0' | ||||
|  | @ -8324,7 +8306,6 @@ class basic_json | |||
| 
 | ||||
|             const char decimal_point = !loc->decimal_point ? '\0' | ||||
|                                        : loc->decimal_point[0]; | ||||
| #endif | ||||
| 
 | ||||
|             // erase thousands separator | ||||
|             if (thousands_sep != '\0') | ||||
|  |  | |||
|  | @ -361,8 +361,8 @@ TEST_CASE("regression tests") | |||
| 
 | ||||
|     SECTION("issue #228 - double values are serialized with commas as decimal points") | ||||
|     { | ||||
|         json j1a = 23.42; | ||||
|         json j1b = json::parse("23.42"); | ||||
|         json j1a = 2312.42; | ||||
|         json j1b = json::parse("2312.42"); | ||||
| 
 | ||||
|         json j2a = 2342e-2; | ||||
|         //issue #230
 | ||||
|  | @ -380,23 +380,33 @@ TEST_CASE("regression tests") | |||
|             { | ||||
|                 return ','; | ||||
|             } | ||||
| 
 | ||||
|             char do_thousands_sep() const | ||||
|             { | ||||
|                 return '.'; | ||||
|             } | ||||
|              | ||||
|             std::string do_grouping() const | ||||
|             { | ||||
|                 return "\03"; | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|         // change locale to mess with decimal points
 | ||||
|         auto orig_locale = std::locale::global(std::locale(std::locale(), new CommaDecimalSeparator)); | ||||
| 
 | ||||
|         CHECK(j1a.dump() == "23.42"); | ||||
|         CHECK(j1b.dump() == "23.42"); | ||||
|         CHECK(j1a.dump() == "2312.42"); | ||||
|         CHECK(j1b.dump() == "2312.42"); | ||||
| 
 | ||||
|         // check if locale is properly reset
 | ||||
|         std::stringstream ss; | ||||
|         ss.imbue(std::locale(std::locale(), new CommaDecimalSeparator)); | ||||
|         ss << 47.11; | ||||
|         CHECK(ss.str() == "47,11"); | ||||
|         ss << 4712.11; | ||||
|         CHECK(ss.str() == "4.712,11"); | ||||
|         ss << j1a; | ||||
|         CHECK(ss.str() == "47,1123.42"); | ||||
|         CHECK(ss.str() == "4.712,112312.42"); | ||||
|         ss << 47.11; | ||||
|         CHECK(ss.str() == "47,1123.4247,11"); | ||||
|         CHECK(ss.str() == "4.712,112312.4247,11"); | ||||
| 
 | ||||
|         CHECK(j2a.dump() == "23.42"); | ||||
|         //issue #230
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue