意外的数字格式输出

时间:2013-06-06 12:19:02

标签: c# formatting

我知道这有很多问题,但我没有发现任何有关此问题的事情。

我尝试按照以下格式格式化数字: value.ToString(“N”,new CultureInfo(“fr-CA”))的类型是float。格式适用但不是我应该采用的方式。我指的是this article about formatting

这里举例说明:

123456     display as 123 456.00
123456.789 display as 123 456.79 // rounded
1234.5     display 1 234.50      //added a 0 padding

有没有办法格式化这样的东西?

123456     display as 123 456    
123456.789 display as 123 456.789 
1234.5     display as 1 234.5

以下是我尝试应用格式化代码的代码

private void dgvform_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    float val;
    if ( (e.ColumnIndex == valeur.Index || e.ColumnIndex == valeurEN.Index)
        && dgvform.Rows[e.RowIndex].Cells[type_d.Index].Value != null && dgvform.Rows[e.RowIndex].Cells[type_d.Index].Value.ToString() == "N"
        && dgvform.Rows[e.RowIndex].Cells[valeur.Index].Value != null
        && float.TryParse(dgvform.Rows[e.RowIndex].Cells[valeur.Index].Value.ToString(), out val))
    {
        if (e.ColumnIndex == valeurEN.Index)
            e.Value = val.ToString("N", new CultureInfo(_formatEN));
        else
            e.Value = string.Format("{0:# ### ###.####}", val);
    }
}

这是datagridview的一部分。大if是确定我是否需要将格式应用于此单元格。 valeurvaleurEN都是列,我需要应用格式化。 e.Value = val.ToString("N", new CultureInfo(_formatEN));是我应用格式的旧方法。 _formatEN基本上是“en-US”。

基本上我想添加一千个分隔符,并确保使用良好的小数分隔符 任何关于我做错的事情?

/ edit: value 是一种浮动

1 个答案:

答案 0 :(得分:1)

我假设您需要构建custom numeric format string

value.ToString("#,0.##########", new CultureInfo("fr-CA"))

前导#,0部分引入了千位分隔符,而尾随.###…会根据需要添加尽可能多的小数位(最多对应于您指定的#个字符数)。 ,.说明符不是逐字使用的,而是根据当前文化进行解释。

有关示例运行,请参阅http://ideone.com/QypZBP

double d = 12345.6789;
Console.WriteLine(d.ToString("#,0.##########", new CultureInfo("fr-CA")));
// Output: "12 345,6789"

修改:由于您已澄清您使用的是float,因此最后一位数字被截断的原因是由于该数据类型的精确度有限。根据MSDN,float具有7位数的精度,这意味着最后两位数字甚至永远不会存储在您的变量中。如果您希望能够代表您的号码,则应将数据类型更改为double