转换为float并在SQL Server上向左移动零

时间:2017-07-08 12:45:05

标签: sql-server transactions

我需要转换为float并在SQL Server中将零填充为零。

我需要这种格式####.##

例如:

2.23   ->  0002.23
123.3  ->  0123.30
12.65  ->  0012.65
34     ->  0034.00

我试过了:

cast(Weight as decimal(6, 2))

还有这个:

REPLACE(STR(Weight, 6), SPACE(1), '0')

和此:

REPLACE(STR(cast(Weight as decimal(6,2)), 6), SPACE(1), '0')

但它们不起作用 - 我得到了5.00000005,我需要0005.00

由于

4 个答案:

答案 0 :(得分:5)

如果是SQL Server 2012+,则FORMAT()是一个选项。

Select format(123.3,'0000.00')

返回

0123.30

Format()有一些很好的功能,但不知道它的性能

答案 1 :(得分:1)

我不确定如何以数学方式实现这一点,但这是通过字符串操作的一种方式

DECLARE @num  NUMERIC(22, 2) = '2.23', 
        @temp VARCHAR(100) 

SET @temp = Cast(@num AS VARCHAR(100)) 

SELECT RIGHT('000'+LEFT(@temp, Charindex('.', @temp)-1), 4) 
       + LEFT(Substring(@temp, Charindex('.', @temp), Len(@temp))+'0', 3) 

答案 2 :(得分:1)

我会使用STR(FloatValue, Precision, Scale)因此

DECLARE @f FLOAT
SET @f = 12.3
SELECT *, STR(x.FltCol, 10, 2) AS FltCol2, REPLACE(STR(x.FltCol, 10, 2), ' ', '0') AS FltCol3
FROM (
    SELECT 1, CONVERT(FLOAT, 12.34) UNION ALL
    SELECT 1, CONVERT(FLOAT, 12.3) 
) x(ID, FltCol)

结果:

ID          FltCol                 FltCol2    FltCol3
----------- ---------------------- ---------- ----------
1           12.34                       12.34 0000012.34
1           12.3                        12.30 0000012.30

示例:STR(12.3, 10, 2)将返回格式化的原始值:

  • 总位数= 10位数(用空格填充)
  • 十进制分隔符后的数字= 2位数(填充为0)。

答案 3 :(得分:0)

这应该这样做

CREATE FUNCTION [usf_PadFloat] ( @InputNum Float, @PadLen Integer )
RETURNS varchar(25)
/****************************************************************************************
-- Returns current time if null
--   (No it doesn't I just lack at changing comments when I reuse code)

select dbo.[usf_PadFloat](28.1273, 4)
select dbo.[usf_PadFloat](17, 4)
select dbo.[usf_PadFloat](2.23, 4)
select dbo.[usf_PadFloat](123.3, 4)
select dbo.[usf_PadFloat](12.65, 4)
select dbo.[usf_PadFloat](34, 4)

****************************************************************************************/
AS
    BEGIN
    DECLARE @Retval varchar(25)

        Select @InputNum = Round(@InputNum,2)

        Select @Retval = cast(@InputNum as varchar(25))

        if charindex('.',@Retval) = 0
            Select @Retval += '.00'

        While charindex('.',Reverse(@Retval)) <> 3 and len(@Retval) < 100 --just n case.
          Select @Retval += '0'

        select @Retval = Right(replicate('0',@padlen+3) + @Retval, @Padlen+3)

        return @Retval
    END