字符串到双转换(逗号到点的问题)
String to Double Conversion (Comma to dot issue)
努力学习基础知识 - 我正在尝试编写一个简单的货币转换器。外源提供的XML汇率用逗号作为小数点分隔符(kurs_sredni):
<pozycja>
<nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
<przelicznik>1</przelicznik>
<kod_waluty>THB</kod_waluty>
<kurs_sredni>0,1099</kurs_sredni>
</pozycja>
我已经设法将数据从 XML 加载到一个漂亮的对象列表 (kursyAktualne) 中,现在我正在尝试计算。我坚持转换。
首先,我将 "kurs_sredni" 分配给一个字符串,尝试用“.”替换“,”。并将其转化为地狱:
string kursS = kursyAktualne[iNa].kurs_sredni;
kursS.Replace(",",".");
kurs = Convert.ToDouble(kursS);
MessageBox.Show(kurs.ToString());
消息框显示 1099 而不是预期的 0.1099 并且 kursS 仍然有逗号,而不是点。
尝试使用我在 Google 上搜索的一些 cultureInfo 内容,但那太随意了。我需要了解如何控制它。
这是因为 Replace
方法 returns 新字符串替换了字符。它不会修改您的原始字符串。
因此您需要重新分配它:
kursS = kursS.Replace(",",".");
只需使用 decimal.Parse
但指定 CultureInfo
。没什么 "random" - 选择一个合适的 CultureInfo
,然后使用它。例如:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var french = CultureInfo.GetCultureInfo("fr-FR");
decimal value = decimal.Parse("0,1099", french);
Console.WriteLine(value.ToString(CultureInfo.InvariantCulture)); // 0.1099
}
}
这只是使用法语作为 一个 使用 ,
作为小数点分隔符的文化示例。使用数据来源的文化可能是有意义的。
请注意,decimal
是比 double
更好的货币值选择 - 您试图表示在 base10 中自然指定的 "artificial" 构造,而不是 "natural" 连续值,例如重量。
(我也会提防以非标准格式提供数据的数据提供者。如果他们弄错了,谁知道他们还会犯什么错误。这不像 XML 没有 明确的数字格式...)
替换returns一个字符串。所以你需要一个作业。
kursS = kursS.Replace(",", ".");
使用 CulturInfo 有 "neater" 方法可以做到这一点。在 MSDN 网站上查找。
你替换的结果没有被使用,而是不包含替换的原始值。
你应该这样做:
kursS = kursS.Replace(",", ".")
此外,如果有千位分隔符,这种方法也不是很安全。
因此,如果您不使用区域性设置,您应该这样做:
kursS = kursS.Replace(".", "").Replace(",", ".")
努力学习基础知识 - 我正在尝试编写一个简单的货币转换器。外源提供的XML汇率用逗号作为小数点分隔符(kurs_sredni):
<pozycja>
<nazwa_waluty>bat (Tajlandia)</nazwa_waluty>
<przelicznik>1</przelicznik>
<kod_waluty>THB</kod_waluty>
<kurs_sredni>0,1099</kurs_sredni>
</pozycja>
我已经设法将数据从 XML 加载到一个漂亮的对象列表 (kursyAktualne) 中,现在我正在尝试计算。我坚持转换。
首先,我将 "kurs_sredni" 分配给一个字符串,尝试用“.”替换“,”。并将其转化为地狱:
string kursS = kursyAktualne[iNa].kurs_sredni;
kursS.Replace(",",".");
kurs = Convert.ToDouble(kursS);
MessageBox.Show(kurs.ToString());
消息框显示 1099 而不是预期的 0.1099 并且 kursS 仍然有逗号,而不是点。
尝试使用我在 Google 上搜索的一些 cultureInfo 内容,但那太随意了。我需要了解如何控制它。
这是因为 Replace
方法 returns 新字符串替换了字符。它不会修改您的原始字符串。
因此您需要重新分配它:
kursS = kursS.Replace(",",".");
只需使用 decimal.Parse
但指定 CultureInfo
。没什么 "random" - 选择一个合适的 CultureInfo
,然后使用它。例如:
using System;
using System.Globalization;
class Test
{
static void Main()
{
var french = CultureInfo.GetCultureInfo("fr-FR");
decimal value = decimal.Parse("0,1099", french);
Console.WriteLine(value.ToString(CultureInfo.InvariantCulture)); // 0.1099
}
}
这只是使用法语作为 一个 使用 ,
作为小数点分隔符的文化示例。使用数据来源的文化可能是有意义的。
请注意,decimal
是比 double
更好的货币值选择 - 您试图表示在 base10 中自然指定的 "artificial" 构造,而不是 "natural" 连续值,例如重量。
(我也会提防以非标准格式提供数据的数据提供者。如果他们弄错了,谁知道他们还会犯什么错误。这不像 XML 没有 明确的数字格式...)
替换returns一个字符串。所以你需要一个作业。
kursS = kursS.Replace(",", ".");
使用 CulturInfo 有 "neater" 方法可以做到这一点。在 MSDN 网站上查找。
你替换的结果没有被使用,而是不包含替换的原始值。 你应该这样做:
kursS = kursS.Replace(",", ".")
此外,如果有千位分隔符,这种方法也不是很安全。 因此,如果您不使用区域性设置,您应该这样做:
kursS = kursS.Replace(".", "").Replace(",", ".")