Десятичный разделитель С#?

У меня есть метод, который возвращает такие числа:

public decimal GetNumber()
{
    return 250.00m;
}

Теперь, когда это значение выводится, например, на консоль, оно содержит запятую (250,00) вместо точки (250,00). Я всегда хочу точку здесь, что я делаю неправильно?


person grady    schedule 06.10.2010    source источник
comment
Если вы не в курсе: , используется в качестве десятичного разделителя во многих европейских странах, таких как Германия, Франция и Италия. Возможно, ваша культура настроена на одно из этих мест?   -  person Matt Ellen    schedule 06.10.2010
comment
Я протестировал эту функцию в консольном приложении и у меня работает нормально. Отображается с точкой (250,00).   -  person Andrei Bularca    schedule 06.10.2010


Ответы (4)


Сам decimal не имеет форматирования - в нем нет ни запятой, ни точки.

Когда вы преобразуете его в строку, вы получите это. Вы можете убедиться, что получили точку, указав инвариантную культуру:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
        decimal d = 5.50m;
        string withComma = d.ToString();
        string withDot = d.ToString(CultureInfo.InvariantCulture);
        Console.WriteLine(withComma);
        Console.WriteLine(withDot);
    }
}
person Jon Skeet    schedule 06.10.2010
comment
System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo(de-DE); десятичная d = 0,3м; строка s1 = d.ToString (germanCultureInfo); -> s1 составляет 0,3, а не 0,3. Почему? - person Offler; 10.06.2015
comment
@Offler: я не могу это воспроизвести - этот точный код дает мне 0,3. - person Jon Skeet; 10.06.2015
comment
Произошло на клиентской машине. Искал в Интернете, чтобы узнать, почему ... Решение теперь найдено на ПК клиентов - Настройки Windows были изменены. - person Offler; 19.06.2015
comment
Я думаю, Convert.ToString() будет безопаснее, чем d.ToString(); @ДжонСкит - person ManirajSS; 23.06.2015
comment
@ManirajSS: Почему ты так думаешь? Как вы думаете, что будет безопаснее? - person Jon Skeet; 23.06.2015
comment
Сославшись на эту ссылку, я узнал, что http://stackoverflow.com/a/326071/3186681 .Tostring() может генерировать исключение, если объект имеет значение null. но Convert.Tostring() будет обрабатывать нулевые объекты и возвращать строку.Empty. Но в вашем ответе d не обнуляется. Так что нет проблем (если он обнуляемый, он может выдать ошибку). Исправьте, если я ошибаюсь в легенде. :) @JonSkeet - person ManirajSS; 23.06.2015
comment
@ManirajSS: Точно, d не может быть нулевым, поэтому нет смысла вызывать Convert.ToString. (Кроме того, если бы оно было обнуляемым, но не ожидалось, что оно будет нулевым, часто исключение было бы лучшим результатом, чем пустая строка...) - person Jon Skeet; 23.06.2015

Как объяснил Джон Скит, вы должны указать культуру, используемую для форматирования string:

var str = GetNumber().ToString(System.Globalization.CultureInfo.InvariantCulture);

Рекомендуется всегда использовать перегрузку ToString, в которой вы указываете язык и региональные параметры. В противном случае .NET использовать текущий поток Culture, который будет записывать разные strings в вывод в соответствии с локалью PC...

person Eilistraee    schedule 06.10.2010
comment
... с другой стороны, вполне может быть, что использование текущей локали на ПК (учитывая, что мы не говорим о веб-приложении) является предпочтительным поведением. В конце концов, это то, что пользователь привык видеть. - person Fredrik Mörk; 06.10.2010
comment
Да, я согласен с тобой. Это допустимое поведение, когда строка будет использоваться в пользовательском интерфейсе. Но это может быть реальной проблемой, когда строка используется для выполнения какой-либо сериализации. В этом случае десериализация может завершиться ошибкой в ​​зависимости от исполняемой локали ПК... И вы не увидите этого, пока продукт не будет отправлен на платформу с другой локалью. Я предпочитаю несколько секунд подумать об этом (и принять разумное решение), чем сожалеть об этом позже. - person Eilistraee; 06.10.2010

Форматирование, зависящее от локали?

http://en.wikipedia.org/wiki/File:DecimalSeparator.svg (Зеленый соответствует запятой, поэтому, если вы вызываете ToString() в своем десятичном разряде, используя информацию о культуре любого из этих мест, вы увидите запятую).

person Tim Medora    schedule 06.10.2010

Я проверил его с помощью Visual Studio 2008 (консольное приложение), и он не показывает "," вместо "." , пожалуйста, предоставьте более подробную информацию. Я думаю, что это проблема культурной информации. пожалуйста, предоставьте дополнительные сведения о коде

class Program
{
    static void Main(string[] args)
    {
        Console.Write(GetNumber());
    }
    public static  decimal GetNumber()
    {
        return 250.00m;
    }

}
person Dr. Rajesh Rolen    schedule 06.10.2010