【问题标题】:Show comma instead of point as decimal separator显示逗号而不是点作为小数分隔符
【发布时间】:2015-10-15 04:00:35
【问题描述】:

我只想在德国获得正确的数字格式,所以我需要将逗号显示为小数点分隔符而不是点。但是这个……

DECLARE @euros money
SET @euros = 1025040.2365
SELECT CONVERT(varchar(30), @euros, 1)

显示1,025,040.24 而不是1.025.040,24(或1025040,24)。在 C# 中提供适当的 CultureInfo 很简单,但如何在 T-SQL 中做到这一点?

我真的需要使用REPLACE吗?但即便如此,如何正确替换1,025,040.24

【问题讨论】:

  • 格式化是一个显示属性,你为什么要在 SQL 中这样做?
  • 值 '1,025,040.24' 的预期结果是什么,你觉得呢?
  • @Jamiec:因为它是一个视图。但你是对的,它可以在客户端应用程序中完成。但在这种情况下,我想控制数据库中的所有内容。
  • @PankajExplorer - 大多数使用. 作为千位分隔符的文化都使用, 作为小数分隔符(是的,正好相反)
  • 我在我的数据库中运行您的查询它返回我 1,025,040.24 为什么?

标签: sql-server tsql sql-server-2005 type-conversion currency


【解决方案1】:

为了提供适当的文化信息,在 SQL 2012 中有 FORMAT() 函数。这是一个例子:

declare @f float = 123456.789;

select
  [raw]      = str(@f,20,3)
 ,[standard] = cast(format(@f, 'N', 'en-US') as varchar(20))
 ,[German] = cast(format(@f, 'N', 'de-DE') as varchar(20))

返回

raw                  |standard   |German     |
---------------------|-----------|-----------|
          123456.789 |123,456.79 |123.456,79 |

您还可以在第二个参数中指定自定义格式字符串,其规则与 .NET 相同。

文档:https://msdn.microsoft.com/en-US/library/hh213505.aspx

【讨论】:

  • 请注意,'de-de' 是德语,而不是欧洲 :) 欧洲其他国家/地区有其他格式化数字的方式。最好的,Nitpicker 先生
  • @TorkilJohnsen 你是对的,尽管意思很清楚。我更新了答案
【解决方案2】:

嗯,据我所知,没有针对特定文化的转换选项。

所以你可以使用替换来做到这一点(是的,它看起来有点难看......)

select 
    replace(replace(replace(convert(varchar(30), @euros, 1), ',', '|'), '.', ','), '|', '.')

想法:先把逗号换成东西,再把点换成逗号,再把“东西”换回点。

【讨论】:

  • 是的,REPLACEs 链是你能做的最好的。
  • tim 查询对我的数据库运行良好,它给了我 1,025,040.24 而没有做任何事情,为什么?
  • @tinka: 我不想要英语格式我想要德语(和其他)1.025.040,24
  • @tinka - 大概是因为您的默认语言已经将值格式化为1.025.040,24。此解决方案 swap 点和逗号,但您从 money 的原始 CONVERT 获得的值取决于您的语言设置。例如。在原始问题的代码上方添加SET Language german,您将获得所需的结果。但是您不能在视图定义中保存语言设置,并且许多服务器设置都让每个人都使用美国英语设置……其他原因。
  • 似乎可以完成这项工作。谢谢你。我会把它变成一个标量值函数,我不想在我的查询中看到这个奇怪的 sql。
【解决方案3】:
DECLARE @euros money
SET @euros = 1025040.2365
SELECT REPLACE(CONVERT(varchar(30), @euros, 0), '.', ',')

应该这样做(至少要得到1025040,24

【讨论】:

    【解决方案4】:

    你可以像这样使用replace

    DECLARE @euros money 
    SET @euros = 1025040.2365
    
    SELECT REPLACE(REPLACE(CONVERT(varchar(30), @euros, 1),',',''),'.',',');
    

    SQL Fiddle Demo

    【讨论】:

      【解决方案5】:

      您可以先将千位分隔符 comma(,) 替换为长度为零的字符串 (''),然后您可以在同一个 select 语句中将 Decimal('.') 替换为 comma(',')。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        • 2021-06-28
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-09-28
        • 1970-01-01
        相关资源
        最近更新 更多