如何在单行中将逗号转换为点号,将点号转换为逗号

6

我有一个像这样的数字 12,345,678.09,我想把它转换成 12.345.678,09 的格式。 我考虑先用 . 把字符串分割开来,然后把字符串中的逗号改为点,再用逗号将它们连接起来。

string value = "12,345,678.09";
string[] parts = value.Split(new char[]{'.'});
string wholeNumber = parts[0].Replace(",", ".");
string result = String.Format("{0},{1}", wholeNumber, parts[1]);

我觉得这种方法很笨拙。有更好的方法吗?

5
针对特定文化,使用数字字符串格式化更有意义吗? - Daniel A. White
你的意思是将“12,345,678.09”转换为“12.345.678.09”吗? - Liam McInroy
他可能是指将12,345,678.09表示为12.345.678,09,因为这是根据不同文化设置表示相同数字的两种不同方式。 - Jamiec
@DanielA.White:客户端机器似乎存在一些问题,代码托管在该机器上。意大利文化在我的机器上可以正常工作,但在客户托管的机器上给我奇怪的值。 - naveen
@Nikhil:笔误。我只是想结束它。今天真的很长,朋友。抱歉 :) - naveen
@Jamiec:是的,就是这样。谢谢。 - naveen
5个回答

9
这个(正确的)方法是使用适用于你正在格式化的文化 CultureInfo,而不是简单地串联字符串。看起来你需要使用意大利文化 it-IT
var num = 123456789.01;
var ci = new CultureInfo("it-IT");
Console.WriteLine(num.ToString("#,##0.00",ci)); //output 123.456.789,01

实时示例:http://rextester.com/ARWF39685

请注意,在格式字符串中,您使用,表示“数字组分隔符”,而.表示“小数点分隔符”,但是文化信息将其替换为文化的正确分隔符-在意大利文化方面,它们完全相反(.是组分隔符,,是小数分隔符)。


我之前使用了.ToString("c", ci)。我一定会尝试这个方法的。实际上,我在问题中创建了那个字符串,使用的是#,#.00,为什么你在小数点前面加了一个零占位符? - naveen
@naveen - 没有特定的原因,你的格式字符串看起来很好,只需要使用正确的区域信息即可。 - Jamiec

9

如果你的字符串中没有出现过某个符号,比如'$',你可以按照以下方式进行操作:

parts[0].Replace(",", "$").Replace(".", ",").Replace("$", ".");

当然,在CPU周期方面,这是次优的,但就保持在单行方面而言,它有效地完成了任务。


+1:这是我的另一个选择 :) 从 CPU 周期的角度来看,它不会很笨重吗? - naveen
1
当然,从 CPU 周期的角度来看这是很浪费的——它创建了两个对象,在赋值完成之前就被丢弃了。然而,试图对其进行优化几乎肯定是过早的:至少你需要对你的应用程序进行分析,以确定该行是否接近热点列表的顶部。@naveen - Sergey Kalinichenko

4
string value = "12,345,678.90";
value = string.Join(".", value.Split(',').Select(s => s.Replace(".", ",").ToArray());

1

你有

string value = "12,345,678.09";
value = value.replace(",", "_").replace(".", ",").replace("_", ".")

0

你可以选择:

string newString = Convert.ToDouble(oldString).ToString("#,0.##", new CultureInfo("de-DE"));

更多信息请点击这里
所有内容都在一行中,这是推荐的做法。
您还可以使用其他文化或CultureInfo.CurrentCulture,以显示用户习惯于查看数字的方式。如果他在意大利的 Windows 上,则会有CurrentCulture == "it-IT",数字格式也相应地改变。CurrentCulture可能是您要寻找的,我猜错了请纠正我。
编辑:根据 Jamiecs 评论此方式无法在字符串上工作,因此我添加了一个转换。但是请注意:如果转换失败,它可能会抛出异常。所以最好将它分成几行并使用 Double.TryParse() 或类似的东西来进行操作。


这不适用于 oldString 是字符串的情况,只适用于数字格式化。因此,oldString 需要是数值型的 - 请查看我的答案。 - Jamiec
@Jamiec:确实,我忽略了它不能处理字符串。所以缺少的是将字符串转换为数字,但我不知道一种安全的方法可以在一行中完成这个操作。 - Skalli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接