【问题标题】:Format a number with commas but without decimals in SQL Server 2008 R2?在 SQL Server 2008 R2 中用逗号格式化数字但不带小数?
【发布时间】:2012-10-23 19:28:10
【问题描述】:

我正在使用以下内容在 T-SQL 中创建逗号格式的数字。我怎样才能摆脱小数点和小数点后的数字。那么如果我在格式化后得到 1,112.00,我怎么会只得到 1,112?

SELECT CONVERT(varchar, CAST(1112 AS money), 1)

【问题讨论】:

标签: sql sql-server sql-server-2008


【解决方案1】:
DECLARE @val varchar(50)

set @val = CONVERT(varchar(50), CAST(1112 AS money), 1)
SELECT  left(@val, len(@val) - 3)

这也适用于小数点后的数字:

DECLARE @val varchar(50)

set @val = CONVERT(varchar(50), CAST(1112.56 AS money), 1)
SELECT  left(@val, len(@val) - 3)

注意:正如@Mahmoud Gamal 所指出的,格式化通常更适合在前端执行。

【讨论】:

    【解决方案2】:

    像这样:

    SELECT REPLACE(CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1), '.00', '');
    

    这将始终正常工作。因为CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1) 总是会返回一个带有.00 的数字。但是,MitchWheat's answer 更好,以防逗号后面有带十进制数字的数字。

    请注意:您应该考虑在前端应用程序中执行此格式化操作。 T-SQL 与格式化无关。

    【讨论】:

    • Mahmoud - 感谢您的帮助。如果我们有 1112.34 那么截断 .00 将不起作用。我正在寻找一个通用的解决方案。
    • @Sunil - 是的,你是对的。这在 1112.34 的情况下不起作用。但如果您在问题中提到的情况,它总是可以正常工作。因为CONVERT(VARCHAR(20), CAST(1112 AS MONEY), 1); 总是返回一个带有.00 的数字不是吗?无论如何,@MitchWheat 的答案都比这更好,并且适用于这种情况。
    • +1 表示关于前端应用程序中的格式设置。
    【解决方案3】:
    PARSENAME(CONVERT(VARCHAR,CAST(1112 AS MONEY),1),2)
    

    它会很好地工作。

    当自动将数字转换为货币数据类型时,小数点后将添加 2 个零。 PARSENAME 函数将删除该零。

    【讨论】:

    • 我删除了我的评论。将来,使用 OP 的实际变量名称和/或值以及包括对正在发生的事情的描述而不是仅仅发布代码块会很有帮助。由于缺少这些,因此该代码似乎与问题无关,但我的假设不正确。
    【解决方案4】:

    https://database.guide/how-to-format-numbers-in-sql-server/

    从 SQL 2012 开始,您可以编写:

    SELECT FORMAT(ColumnName, 'N0');
    

    【讨论】:

      【解决方案5】:

      经过一番研究,我找到了最初问题的 2 个可能答案。它们在下面列出。

      选项 1:Mitch Wheat 的答案是一个可能的答案。但是,如果想要在 SELECT 中格式化列值,则必须使用 Mitch 的 T-SQL 代码创建用户定义的标量函数,并从我们的 SQL 调用此 UDF。

      -- =============================================
      -- Description: Formats a number and truncates 
      --              the decimal part. You can pass 
      --              a number as a string or a numeric type.
      -- =============================================
      CREATE FUNCTION dbo.Utility_fn_FormatNumberAndTruncateDecimals
      (
         @unFormattedNumber VARCHAR(100)
      )
       RETURNS VARCHAR(100)
        AS
       BEGIN
         DECLARE @val VARCHAR(100)
         SET @val = convert(VARCHAR(50), cast(@unFormattedNumber AS MONEY), 1)
      
         RETURN (SELECT left(@val, len(@val) - 3))
       END
       GO
      
       --call this function using either of the SELECTS below
       SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals('233444')
       SELECT dbo.Utility_fn_FormatNumberAndTruncateDecimals(233444.345)
      

      选项 2: 我们可以使用名为“parsename”的内置系统函数(如下面的 T-SQL 代码中所示)来格式化和截断小数。

      SELECT PARSENAME(CONVERT(VARCHAR, CAST('2334442221.345222'  AS MONEY), 1),2)
      

      【讨论】:

      • “但是,当人们想要在 SELECT 中格式化列值时” - 不正确。我这样做是为了明确意图。我本可以轻松地内联完成。
      • 米奇 - 你是对的。不知怎的,我忽略了这个事实。我可以直接使用你的逻辑内联。感谢您的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2014-08-30
      • 2011-05-21
      • 1970-01-01
      相关资源
      最近更新 更多