是否有一种简单的方法可以将数字(在我的情况下为整数)转换为以逗号分隔的nvarchar
字符串?
例如,如果我在某个字段中存储了int
值1000000
,如何将其转换为nvarchar
字符串,输出结果为“1,000,000”?< / p>
我可以轻松编写一个函数来执行此操作但我想确保没有更简单的方法来调用CAST
或CONVERT
。
答案 0 :(得分:52)
您没有在T-SQL中找到如何执行此操作的简单示例的原因是,在SQL代码中实现格式化逻辑通常被认为是不好的做法。 RDBMS根本不是为演示而设计的。尽管可以进行一些有限的格式化,但让应用程序或用户界面处理此类型的格式化几乎总是更好。
但是如果你必须(有时我们必须!)使用T-SQL,将你的int转换为money并将其转换为varchar,如下所示:
select convert(varchar,cast(1234567 as money),1)
如果您不想要尾随小数,请执行以下操作:
select replace(convert(varchar,cast(1234567 as money),1), '.00','')
祝你好运!
答案 1 :(得分:20)
对于 SQL Server 2012 或更高版本,更简单的解决方案是使用FORMAT ()
Documentation。
EG:
SELECT Format(1234567.8, '##,##0')
结果:1,234,568
答案 2 :(得分:3)
不确定它在tsql中有效,但some platforms有to_char()
:
test=#select to_char(131213211653.78, '9,999,999,999,999.99');
to_char
-----------------------
131,213,211,653.78
test=# select to_char(131213211653.78, '9G999G999G999G999D99');
to_char
-----------------------
131,213,211,653.78
test=# select to_char(485, 'RN');
to_char
-----------------
CDLXXXV
如示例所示,格式的长度需要与数字的长度匹配才能获得最佳结果,因此如果需要,您可能希望将其包装在函数中(例如number_format())。
转换为货币也是有效的,正如其他回复者指出的那样。
test=# select substring(cast(cast(131213211653.78 as money) as varchar) from 2);
substring
--------------------
131,213,211,653.78
答案 3 :(得分:3)
快速&amp;脏到int到nnn,nnn ......
declare @i int = 123456789
select replace(convert(varchar(128), cast(@i as money), 1), '.00', '')
>> 123,456,789
答案 4 :(得分:2)
从SQL Server 2012(及以上版本),FORMAT()方法提供了最快捷,最简单的解决方案。以下是一些提示。
语法 :Format( value, format [, culture ] )
返回 :Format函数返回使用指定格式和可选区域性格式化的NVarchar字符串。 (对于无效的格式字符串,返回NULL。)
注意:Format()函数在CLR /所有.NET语言中是一致的,并为生成格式化输出提供了最大的灵活性。
以下是使用此功能可以实现的几种格式类型:
数字/货币格式 - 货币为“C”,货币符号为“N”,十六进制小数为“x”。
日期/时间格式 - 'd'短日期,'D'长日期,'f'短日期/时间,'F'长日期/时间,'t '很短的时间,'T'很长的时间,'m'月+日,'y'年+月。
自定义格式 - 您可以使用某些符号/字符形成自己的自定义格式,例如dd,mm,yyyy等(对于日期)。 hash(#)货币符号(££等),逗号(,)等。见下面的例子。
<强> 实施例 强>:
内置数字/货币 格式的示例:
select FORMAT(1500350.75, 'c', 'en-gb') --> £1,500,350.75
select FORMAT(1500350.75, 'c', 'en-au') --> $1,500,350.75
select FORMAT(1500350.75, 'c', 'en-in') --> ₹ 15,00,350.75
内置日期的示例 格式:
select FORMAT(getdate(), 'd', 'en-gb') --> 20/06/2017
select FORMAT(getdate(), 'D', 'fr-fr') --> mardi 20 juin 2017
select FORMAT(getdate(), 'F', 'en-us') --> Tuesday, June 20, 2017 10:41:39 PM
select FORMAT(getdate(), 'T', 'en-gb') --> 22:42:29
自定义格式 的示例:
select FORMAT(GETDATE(), 'ddd dd/MM/yyyy') --> Tue 20/06/2017
select FORMAT(GETDATE(), 'dddd dd-MMM-yyyy') --> Tuesday 20-Jun-2017
select FORMAT(GETDATE(), 'dd.MMMM.yyyy HH:mm:ss') --> 20.June.2017 22:47:20
select FORMAT(123456789.75,'$#,#.00') --> $123,456,789.75
select FORMAT(123456789.75,'£#,#.0') --> £123,456,789.8
有关详细信息,请参阅MSDN。
答案 5 :(得分:0)
你真的不应该在SQL中这样做 - 你应该在中间件中格式化它。但我意识到有时会有一个边缘情况需要人做这样的事情。
看起来它可能有你的答案:
答案 6 :(得分:0)
我看了几个选项。这是我的两个最爱,因为我需要四舍五入。
,DataSizeKB = replace(convert(varchar,Cast(Round(SUM(BigNbr / 0.128),0)as money),1), '.00','')
,DataSizeKB2 = format(Round(SUM(BigNbr / 0.128),0),'##,##0')
-----------------
--- below if the full script where I left DataSizeKB in both methods -----------
--- enjoy ---------
--- Hank Freeman : hfreeman@msn.com
-----------------------------------
--- Scritp to get rowcounts and Memory size of index and Primary Keys
SELECT
FileGroupName = DS.name
,FileGroupType =
CASE DS.[type]
WHEN 'FG' THEN 'Filegroup'
WHEN 'FD' THEN 'Filestream'
WHEN 'FX' THEN 'Memory-optimized'
WHEN 'PS' THEN 'Partition Scheme'
ELSE 'Unknown'
END
,SchemaName = SCH.name
,TableName = OBJ.name
,IndexType =
CASE IDX.[type]
WHEN 0 THEN 'Heap'
WHEN 1 THEN 'Clustered'
WHEN 2 THEN 'Nonclustered'
WHEN 3 THEN 'XML'
WHEN 4 THEN 'Spatial'
WHEN 5 THEN 'Clustered columnstore'
WHEN 6 THEN 'Nonclustered columnstore'
WHEN 7 THEN 'Nonclustered hash'
END
,IndexName = IDX.name
,RowCounts = replace(convert(varchar,Cast(p.rows as money),1), '.00','') --- MUST show for all types when no Primary key
--,( Case WHEN IDX.[type] IN (2,6,7) then 0 else p.rows end )as Rowcounts_T
,AllocationDesc = AU.type_desc
/*
,RowCounts = p.rows --- MUST show for all types when no Primary key
,TotalSizeKB2 = Cast(Round(SUM(AU.total_pages / 0.128),0)as int) -- 128 pages per megabyte
,UsedSizeKB = Cast(Round(SUM(AU.used_pages / 0.128),0)as int)
,DataSizeKB = Cast(Round(SUM(AU.data_pages / 0.128),0)as int)
--replace(convert(varchar,cast(1234567 as money),1), '.00','')
*/
,TotalSizeKB = replace(convert(varchar,Cast(Round(SUM(AU.total_pages / 0.128),0)as money),1), '.00','') -- 128 pages per megabyte
,UsedSizeKB = replace(convert(varchar,Cast(Round(SUM(AU.used_pages / 0.128),0)as money),1), '.00','')
,DataSizeKB = replace(convert(varchar,Cast(Round(SUM(AU.data_pages / 0.128),0)as money),1), '.00','')
,DataSizeKB2 = format(Round(SUM(AU.data_pages / 0.128),0),'##,##0')
,DataSizeKB3 = format(SUM(AU.data_pages / 0.128),'##,##0')
--SELECT Format(1234567.8, '##,##0.00')
---
,is_default = CONVERT(INT,DS.is_default)
,is_read_only = CONVERT(INT,DS.is_read_only)
FROM
sys.filegroups DS -- you could also use sys.data_spaces
LEFT JOIN sys.allocation_units AU ON DS.data_space_id = AU.data_space_id
LEFT JOIN sys.partitions PA
ON (AU.[type] IN (1,3) AND
AU.container_id = PA.hobt_id) OR
(AU.[type] = 2 AND
AU.container_id = PA.[partition_id])
LEFT JOIN sys.objects OBJ ON PA.[object_id] = OBJ.[object_id]
LEFT JOIN sys.schemas SCH ON OBJ.[schema_id] = SCH.[schema_id]
LEFT JOIN sys.indexes IDX
ON PA.[object_id] = IDX.[object_id] AND
PA.index_id = IDX.index_id
-----
INNER JOIN
sys.partitions p ON obj.object_id = p.OBJECT_ID AND IDX.index_id = p.index_id
WHERE
OBJ.type_desc = 'USER_TABLE' -- only include user tables
OR
DS.[type] = 'FD' -- or the filestream filegroup
GROUP BY
DS.name ,SCH.name ,OBJ.name ,IDX.[type] ,IDX.name ,DS.[type] ,DS.is_default ,DS.is_read_only -- discard different allocation units
,p.rows ,AU.type_desc ---
ORDER BY
DS.name ,SCH.name ,OBJ.name ,IDX.name
---
;
答案 7 :(得分:-5)
删除带有替换和逗号的逗号:
CONVERT(INT,REPLACE([varName],',',''))
其中varName是包含逗号
的数字值的变量的名称