diff --git a/src/OneScript.StandardLibrary/Json/JSONWriter.cs b/src/OneScript.StandardLibrary/Json/JSONWriter.cs index 509ba8ec4..e82af87fd 100644 --- a/src/OneScript.StandardLibrary/Json/JSONWriter.cs +++ b/src/OneScript.StandardLibrary/Json/JSONWriter.cs @@ -6,6 +6,7 @@ This Source Code Form is subject to the terms of the ----------------------------------------------------------*/ using System; +using System.Globalization; using System.IO; using System.Text; using System.Threading; @@ -255,14 +256,15 @@ public void WriteValue(IValue value, bool useFormatWithExponent = false) { Int64 i = Convert.ToInt64(v); if (useFormatWithExponent) - _writer.WriteRawValue(string.Format(Thread.CurrentThread.CurrentCulture, "{0:E}", i)); + // Разделитель дробной части в JSON всегда точка, от языка системы не зависит + _writer.WriteRawValue(string.Format(CultureInfo.InvariantCulture, "{0:E}", i)); else _writer.WriteValue(i); } else { if (useFormatWithExponent) - _writer.WriteRawValue(string.Format(string.Format(Thread.CurrentThread.CurrentCulture, "{0:E}", v))); + _writer.WriteRawValue(string.Format(CultureInfo.InvariantCulture, "{0:E}", v)); else _writer.WriteValue(v); } diff --git a/src/Tests/OneScript.Core.Tests/JsonWriterCultureTests.cs b/src/Tests/OneScript.Core.Tests/JsonWriterCultureTests.cs new file mode 100644 index 000000000..64c7564fb --- /dev/null +++ b/src/Tests/OneScript.Core.Tests/JsonWriterCultureTests.cs @@ -0,0 +1,41 @@ +/*---------------------------------------------------------- +This Source Code Form is subject to the terms of the +Mozilla Public License, v.2.0. If a copy of the MPL +was not distributed with this file, You can obtain one +at http://mozilla.org/MPL/2.0/. +----------------------------------------------------------*/ + +using System.Globalization; +using FluentAssertions; +using OneScript.StandardLibrary.Json; +using ScriptEngine.Machine; +using Xunit; + +namespace OneScript.Core.Tests +{ + public class JsonWriterCultureTests + { + [Fact] + public void ExponentFormatUsesDotWithCommaDecimalCulture() + { + var culture = CultureInfo.CurrentCulture; + // Культура с запятой в дробной части, как в русской локали, независимо от машины + CultureInfo.CurrentCulture = new CultureInfo("ru-RU"); + try + { + var writer = new JSONWriter(); + writer.SetString(); + writer.WriteStartArray(); + writer.WriteValue(ValueFactory.Create(1000), true); + writer.WriteValue(ValueFactory.Create(1.5m), true); + writer.WriteEndArray(); + + writer.Close().Should().ContainAll("1.000000E+003", "1.500000E+000"); + } + finally + { + CultureInfo.CurrentCulture = culture; + } + } + } +} diff --git a/tests/json/test-json_writer.os b/tests/json/test-json_writer.os index d5c6bb1fd..2677b52fe 100644 --- a/tests/json/test-json_writer.os +++ b/tests/json/test-json_writer.os @@ -26,6 +26,7 @@ СписокТестов.Добавить("Тест_Должен_ПроверитьЗаписьВПоток"); СписокТестов.Добавить("Тест_Должен_ПроверитьСохранениеПотокаПослеЗакрытия"); СписокТестов.Добавить("Тест_Должен_ПроверитьИсключениеНаПотокеТолькоДляЧтения"); + СписокТестов.Добавить("Тест_Должен_ЗаписатьЧислаВЭкспоненциальнойФорме"); Возврат СписокТестов; КонецФункции @@ -347,3 +348,23 @@ КонецПроцедуры +Процедура Тест_Должен_ЗаписатьЧислаВЭкспоненциальнойФорме() Экспорт + + Запись = Новый ЗаписьJSON; + Запись.УстановитьСтроку(); + Запись.ЗаписатьНачалоМассива(); + Запись.ЗаписатьЗначение(1000, Истина); + Запись.ЗаписатьЗначение(1.5, Истина); + Запись.ЗаписатьКонецМассива(); + Текст = Запись.Закрыть(); + + // Разделитель дробной части - точка при любом языке системы + Чтение = Новый ЧтениеJSON; + Чтение.УстановитьСтроку(Текст); + Массив = ПрочитатьJSON(Чтение); + + юТест.ПроверитьРавенство(2, Массив.Количество(), Текст); + юТест.ПроверитьРавенство(1000, Массив[0], Текст); + юТест.ПроверитьРавенство(1.5, Массив[1], Текст); + +КонецПроцедуры