2010-10-06 3 views
12

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

public decimal GetNumber() 
{ 
    return 250.00m; 
} 

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

+6

Если вы не знаете: ',' ​​используется как разделитель десятичных знаков во многих европейских странах, таких как Германия, Франция и Италия. Возможно, у вас есть культура в одном месте? –

+0

Я протестировал эту функцию в консольном приложении и работает нормально для меня. Отображается с точкой (250.00). –

ответ

48

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); 
    } 
} 
+1

System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo («de-DE»); десятичная д = 0,3 м; строка s1 = d.ToString (germanCultureInfo); -> s1 - 0,3 не 0,3. Зачем? – Offler

+1

@Offler: Я не могу воспроизвести это - этот * точный * код дает мне «0,3». –

+1

Случалось на машине для клиентов. Был поиск в Интернете, чтобы узнать, почему ... Решение теперь найдено у клиентов pc - Настройки Windows, где они были изменены. – Offler

1

Форматирование, специфичное для локали?

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

6

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

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

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

+1

... с другой стороны, вполне возможно, что использование текущего Язык на ПК (учитывая, что мы не говорим о веб-приложении) является предпочтительным поведением. В конце концов, это будет то, что пользователь привык видеть. –

+2

Да, я согласен с вами. Это допустимое поведение, когда строка будет использоваться в пользовательском интерфейсе. Но это может быть реальной проблемой, когда строка используется для выполнения какой-либо сериализации.В этом случае десериализация может завершиться неудачно в зависимости от исполняемого языкового стандарта ПК ... И вы не увидите этого, прежде чем продукт будет отправлен на платформу с другим языковым стандартом. Я предпочитаю занять несколько секунд, чтобы подумать об этом (и принять разумное решение об этом), чем сожалеть об этом позже. – Eilistraee

0

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

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

} 
Смежные вопросы