【发布时间】:2010-09-23 11:25:49
【问题描述】:
假设我有一个值为 1 的 int。如何将该 int 转换为零填充字符串,例如 00000001?
【问题讨论】:
假设我有一个值为 1 的 int。如何将该 int 转换为零填充字符串,例如 00000001?
【问题讨论】:
另一种方式是:
DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')
【讨论】:
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8
Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
【讨论】:
SELECT REPLACE(STR(DATEPART(MONTH,[Date]),2),' ','0')
或者,如果你真的想成为硬核...... ;-)
declare @int int
set @int = 1
declare @string varchar(max)
set @string = cast(@int as varchar(max))
declare @length int
set @length = len(@string)
declare @MAX int
set @MAX = 8
if @length < @MAX
begin
declare @zeros varchar(8)
set @zeros = ''
declare @counter int
set @counter = 0
while (@counter < (@MAX - @length))
begin
set @zeros = @zeros + '0'
set @counter = @counter + 1
end
set @string = @zeros + @string
end
print @string
【讨论】:
如果我想填充到特定的总长度,我会使用 REPLICATE 和 DATALENGTH 函数,如下所示:
DECLARE @INT INT
DECLARE @UNPADDED VARCHAR(3)
DECLARE @PADDED VARCHAR(3)
SET @INT = 2
SET @UNPADDED = CONVERT(VARCHAR(3),@INT)
SET @PADDED = REPLICATE('0', 3 - DATALENGTH(@UNPADDED)) + @UNPADDED
SELECT @INT, @UNPADDED, @PADDED
为了简单起见,我在这里使用了变量,但是您可以看到,您可以指定总字符串的最终长度,而不必担心开头的 INT 的大小,只要它是
【讨论】:
我总是用:
SET @padded = RIGHT('z0000000000000'
+ convert(varchar(30), @myInt), 8)
z 阻止 SQL 将字符串隐式转换为 int 以进行加法/连接。
【讨论】:
如果 int 可以变为负数,你就有问题了,所以为了解决这个问题,我有时会这样做:
DECLARE @iVal int
set @iVal = -1
select
case
when @ival >= 0 then right(replicate('0',8) + cast(@ival as nvarchar(8)),8)
else '-' + right(replicate('0',8) + cast(@ival*-1 as nvarchar(8)),8)
end
【讨论】:
这对我有用:
SELECT RIGHT('000' + CAST(Table.Field AS VARCHAR(3)),3) FROM Table
...
我创建了这个用户函数
T-SQL 代码:
CREATE FUNCTION CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(24) AS BEGIN
IF @intlen > 24
SET @intlen = 24
RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(24),@intVal))))
+ CONVERT(nvarchar(24),@intVal) END
例子:
选择 dbo.CIntToChar(867, 6) 作为 COD_ID
输出
000867
【讨论】:
从 SQL Server 2012 开始,您现在可以这样做:
format(@int, '0000#')
【讨论】:
然后是这个,使用 REPLICATE:
SELECT REPLICATE('0', 7) + '1'
当然,您可以根据需要将文字 7 和 '1' 替换为适当的函数;以上为您提供了示例。例如:
SELECT REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt)
将用零填充小于 8 位的整数,最多 8 个字符。
现在,REPLICATE 的第二个参数中的负数将返回 NULL。因此,如果有可能(例如,在上面的示例中,@myInt 可能超过 1 亿个),那么如果字符数超过 8 个,您可以使用 COALESCE 返回不带前导零的数字:
SELECT COALESCE(REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt), CONVERT(nvarchar, @myInt))
【讨论】:
考虑使用“0”填充的非常直接的方法是,如果您将 @_int 固定为 4 位小数,则注入 4 个“0”:
select RIGHT( '0000'+ Convert(varchar, @_int), 4) as txtnum
;如果你的固定空间是 3,你注入 3'0's
select RIGHT( '000'+ Convert(varchar, @_int), 3) as txtnum
;下面我注入 '00' 为每个 bldg 生成 99 个标签
declare @_int int
set @_int = 1
while @_int < 100 Begin
select BldgName + '.Floor_' + RIGHT( '00'+ Convert(varchar, @_int), 2)
+ '.balcony' from dbo.tbl_FloorInfo group by BldgName
set @_int = @_int +1
End
结果是:
'BldgA.Floor_01.balcony'
'BldgB.Floor_01.balcony'
'BldgC.Floor_01.balcony'
..
..
'BldgA.Floor_10.balcony'
'BldgB.Floor_10.balcony'
'BldgC.Floor_10.balcony'
..
..
..
'BldgA.Floor_99.balcony'
'BldgB.Floor_99.balcony'
'BldgC.Floor_99.balcony'
【讨论】:
我认为 Charles Bretana 的答案是最简单和最快的。不使用STR 的类似解决方案是:
SELECT REPLACE(REVERSE(
CONVERT(CHAR(5 /*<= Target length*/)
, REVERSE(CONVERT(VARCHAR(100), @MyInt)))
), ' ', '0')
【讨论】:
使用FORMAT(<your number>,'00000000') 使用尽可能多的零,以便在最终结果中包含数字。
【讨论】: