【问题标题】:C# String.Format() - number format doesn't workC# String.Format() - 数字格式不起作用
【发布时间】:2015-09-15 08:04:49
【问题描述】:

尝试了 this question 的所有不同解决方案后,它似乎没有给我想要的格式 (1.000.000 | 1.234)。

我试过这个:

dataBlock.ValueCell.Value = String.Format("{0:#.##0}", double.Parse(dataBlock.ValueCell.Value)); // 1 234
dataBlock.ValueCell.Value = String.Format("{0:N0}", double.Parse(dataBlock.ValueCell.Value)); // 1 234
dataBlock.ValueCell.Value = String.Format("{0}", double.Parse(dataBlock.ValueCell.Value.ToString("N0"))); // 1 234

//values as I read them from Excel = OLDVALUE
//values as I convert them to the wanted number format = NEWVALUE
//OLDVALUE == 2238,8
//NEWVALUE == 2 239
//OLDVALUE == -5372
//NEWVALUE == -5 372
//OLDVALUE == 3909,6
//NEWVALUE == 3 910

还有其他解决方案吗?

我可以用点替换空格,但这看起来确实是错误的代码。

编辑

edit1:我试过了

dataBlock.ValueCell.Value = dataBlock.ValueCell.Value.ToString().Replace(' ', '.'); 它给了我相同的输出,为什么字符串格式和替换不起作用?

edit2:添加了 Nikita 的回答 [Works]

var doubleValue = double.Parse(dataBlock.ValueCell.Value);
                Console.WriteLine("doubleValue = " + doubleValue);

                var formattedValue = doubleValue.ToString("N0", new CultureInfo("is-IS"));
                Console.WriteLine("formattedValue = " + formattedValue);

                dataBlock.ValueCell.Value = formattedValue;

给了我这个输出:

doubleValue = 29300
formattedValue = 29.300
doubleValue = 20300
formattedValue = 20.300
doubleValue = 32360
formattedValue = 32.360
doubleValue = 28300
formattedValue = 28.300
doubleValue = 9000
formattedValue = 9.000
...

edit3: Here 是更多“缺失”的数据,以便更好地了解情况

【问题讨论】:

  • 是的,这就是我在第一句话的超链接中提到的,我已经尝试了那里的所有解决方案。
  • 你为什么用 Parse(),只用字符串格式试试。
  • 你检查过 .ToString("N",new CultureInfo("is-IS")) 吗??

标签: c# .net number-formatting string.format


【解决方案1】:

添加一个额外的步骤来验证double.Parse() 的工作原理。可能会有一些惊喜。其中之一可以是整数值和小数之间的分隔符:,.

// step 1: verify your string taken from excel
var cellString = dataBlock.ValueCell.Value.ToString();
// if you have a blank space there, remove it
cellString = cellString.Replace(' ', '');

// step 2: verify your double converted value
var doubleValue = double.Parse(cellString);
Console.WriteLine("doubleValue = " + doubleValue);

// step 3: verify the formatting
var formattedValue = doubleValue.ToString("#.##0");
Console.WriteLine("formattedValue = " + formattedValue);

dataBlock.ValueCell.Value = formattedValue;

查看实际数据后进行编辑: 您从单元格中获取的字符串中有一个空格。您可以通过添加另一个步骤来验证这一点

【讨论】:

  • 没错。这取决于文化。来自 MSDN。:“以指定的文化特定格式转换数字的字符串表示形式”
  • 所以这意味着这并不适用于每个系统,这取决于您使用的语言或区域设置,例如有时它会读取为 1234,56 有时读取为 1234.56?这个解决方案也给了我这个输出i.imgur.com/T8qIqZB.png
  • 格式字符串中的错字,因为没有参数,0:必须去掉。
  • @tomab,还是一样的输出
  • 好的,所以您的问题中缺少一些信息。请在单元格中添加值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多