【问题标题】:Oddity with ToString() custom number formattingToString() 自定义数字格式的奇数
【发布时间】:2009-06-01 10:24:52
【问题描述】:

我正在尝试将 123456 形式的数字转换为 123,456,我发现这很容易通过使用自定义格式为 N0 的 .NET ToString() 方法来实现。

但是在一种数据情况下,我在使用这种方法时会得到奇怪的格式。

在这种情况下,我正在为我的输入表动态生成一个 DataTable 以测试代码。

DataTable dt = new DataTable();

dt.Columns.Add("Cases", typeof(Int32));

例如,我的数据在应用格式之前是这样的。

-------------------------------------------- |案例 |第2495章3937 | 3207 | 4173 | 4265 | --------------------------------------------------------

我希望它看起来像这样。

---------------------------------------------- -- |案例 | 2,495 | 3,937 | 3,207 | 4,173 | 4,265 | --------------------------------------------------

我尝试使用这样的代码对其进行格式化。

output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("N0");

(注意:格式奇怪的原因是因为我正在获取一个 DataTable 并将其转置到另一个 DataTable。)

使用上述格式,我现在返回以下数据。

---------------------------------------------- -------------------------- |案例 | 01/02/0495 | 0937 年 1 月 3 日 | 01/03/0207 | 0173 年 1 月 4 日 | 01/04/0265 | -------------------------------------------------- ------------------------------------

然后我尝试使用一位小数点:

output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("N01");

这给了我以下结果。

---------------------------------------------- -------- |案例 | 2495.0 | 3937.0 | 3207.0 | 4173.0 | 4265.0 | -------------------------------------------------- ----

这让我很困惑,因为它接受了数字可以这样格式化的事实。

接下来我尝试了不同的格式化字符串的方法。

output.Rows[r][c] = string.Format("{0:N0}", input.Rows[c - 1][r + 1]);
output.Rows[r][c] = Convert.ToInt32(input.Rows[c - 1][r + 1]).ToString("#,##0");

这些都没有给出我想要的数字格式。谁能告诉我哪里出错了?是不是太简单了,我没抓住重点?

【问题讨论】:

    标签: c# asp.net format numbers tostring


    【解决方案1】:

    在我看来,您只是错误地设置了DataTable 中列的数据类型。尝试将其明确设置为 int(目前看起来像 DateTime)。

    另外 - DataTable 的工作是保存数据;不要显示它。您可以将其存储为预先格式化为strings,我猜(只要您告诉列是字符串)-但如果您将其存储为int,那么忘记展示;一旦你运行Convert.ToInt32,你的工作就结束了。它的外观是DataGridView(或其他)的工作;告诉那个关于“N0”...

    【讨论】:

    • 不幸的是,在本示例中并非如此,因为我正在生成一个输入 DataTable 作为示例来测试代码。本例中的字段由 dt.Columns.Add("Cases", typeof(Int32)); 定义我将用它来更新我的问题。
    • 是这样吗?我无法在 DataTable 中保存格式化数据?如果是这种情况,那么为什么我能够为其他 DataTables 这样做?我正在做什么来获取未格式化的数据,对其进行格式化,然后将其转换为新的 DataTable。这是第一个对我不起作用的例子。
    • 很好 - 但是如果你想保存格式化的数据,那么一定要告诉它这些列是字符串。否则它可能会做出(不正确的)假设......
    • 重新编辑;在这种情况下,引擎盖下的列将是一个 int[];所以调用 ToString(...) 只是为它工作;它需要将它 back 解析为 int,然后再显示...
    • 感谢 cmets 我会将格式移出 DataTable 并在 GridView 等中进行。
    【解决方案2】:

    尝试像 ToString("N"); 中那样简单地使用“N”;

    【讨论】:

    • 这可行,但不会给我格式化数字到零小数位。
    • 如果你的 DataTable 只包含整数,那怎么会有小数位呢?
    • @Jon 因为当您使用“N”时,它会查看 NumberFormatInfo.NumberDecimalSeparator 属性,该属性从计算机的控制面板区域和语言设置中获取值,在我的情况下,它必须是两位小数.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2017-10-06
    • 2012-12-12
    • 2010-10-18
    • 2014-03-29
    • 1970-01-01
    相关资源
    最近更新 更多