2015-05-07 43 views
1

这是我的代码:如何防止将decimal.TryParse转换为“。”为“。”?

string myValue = "0,203"; 

decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal; 

...

myValueAsDecimal is 0.203 now 

难道myValueAsDecimal有0203后TryParsedecimal内部表示始终是0.203,我需要的,如果格式化输出GUI我需要0,203?

+1

它既没有逗号也没有句点,它作为表示被存储。 – Sayse

+1

数字的内部表示总是二元的。文字(人)表示取决于您指定的文化(或未指定)。要显示具有特定小数点的数字,您必须将正确的文化传递给ToString方法或用于格式化的其他方法。要指定一个值,必须使用点作为小数点,因为ti是编程语言的语法。 –

+0

MIkroDel,我想补充一点,你可能不应该试图强制用户使用一个小数分隔符,你的应用程序应该支持他们正在使用的任何文化。用户可能不熟悉不同的文化使用不同的小数点分隔符,绝对不会尝试用外部分隔符输入自己的数字 – Sayse

回答

6

难道myValueAsDecimal的TryParse

号这只是一个号码有0203 - 它没有一个文本格式的概念。想想更简单的另一种方式,请考虑以下两行代码:

int x = 0x100; 
int y = 256; 

这两个值是否相同?是的,他们代表相同的号码。如果您将xy的值转换为字符串,默认情况下它们都会以“256”结尾 - 但如果您请求十六进制表示形式,则它们最终都可以为“100”。

区分变量的实际值和文本表示很重要。很少有类型(我不能立即想到)带有关于文本表示的信息 - 例如,DateTime可以从各种格式解析,但没有原始文本格式的“内存”。这只是一个日期和时间,可以根据任何格式进行格式化。

如果需要维持的想法“的十进制数,并在它最初所代表的文化”,那么你应该创建自己的类或结构为配对。它不在decimal本身。

+0

这意味着要有0,203或0.203我必须使用我的GUI?例如格式输出等。 – MikroDel

+0

@MikroDel:我不知道如何解释你的评论,恐怕。但是,是的,如果您想区分已被解析为相同“十进制”数字的“0,203”和“0.203”,则需要记住某些值的变化,而不是“小数”本身。尽管你想要做什么并不完全清楚。 –

+0

根据系统的选择文化,我在表格0,203或0.203中输入字符串。 该输入应该以小数形式存储在数据库中,并且还根据文化情况以0,203或0.203的形式显示为输出。 – MikroDel

2
decimal d = 0.203m; 

Console.WriteLine(d.ToString(CultureInfo.InstalledUICulture)); 
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture));  // decimal point: dot 
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("en-US"))); // default decimal point: dot 
Console.WriteLine(d.ToString(CultureInfo.GetCultureInfo("ru-RU"))); // default decimal point: comma 

结果:

0,203 
0.203 
0.203 
0,203 
+0

CurrentCulture和InstalledUICulture有什么区别? – MikroDel

+1

你应该解释你在这里试图回答什么。 OP似乎在询问* decimal *具有的分隔符 – Sayse

+0

Decimal(和其他数字类型)没有分隔符。在转换为字符串(使用ToString()方法)后添加。默认的ToString()方法使用您的计算机选定文化的小数点。 –

1

看起来像你的CurrentCulture,作为NumberDecimalSeparator这就是为什么你的解析成功。

实际上,0.2030,203与value相同。只有当你打印它们时,他们的文字表示。

如果您希望将您的价值作为0,203表示法,您可以使用具有,的文化作为NumberDecimalSeparator

例如,我的文化(tr-TR)有一个,。当你用它来表示你的小数时,你会得到0,203

string myValue = "0,203"; 
decimal myValueAsDecimal; 
decimal.TryParse(myValue, NumberStyles.Any, CultureInfo.CurrentCulture, out myValueAsDecimal); 
myValueAsDecimal.ToString(new CultureInfo("tr-TR")).Dump(); // 0,203 
1

Decimal的价值是一样的,不管文化,它的

0。203

什么样的变化是它的字符串表示(在你的情况小数点分隔符),所以如果 要更改小数点分隔并且不想改变文化 你可以指定NumberDecimalSeparator您的自定义NumberFormatInfo例如

Decimal d = 0.203M; 

    NumberFormatInfo myNumberInfo = new NumberFormatInfo() { 
    NumberDecimalSeparator = "," // Comma, please 
    }; 

    String result = d.ToString(myNumberInfo); // "0,203" 
相关问题