需要根据十进制格式左右填充零字符串值

时间:2018-04-25 11:24:29

标签: sql sql-server

所以,如果我有一个数据(varchar),比如说10.1

我需要将值0000101000000

表示(000010)整数和(1000000)十进制值。

它是一个13个字符的字符串,小数点前的数字应该是前6个字符,小数点后面的数字应该是最后7个字符

5 个答案:

答案 0 :(得分:2)

也许..?

DECLARE @d decimal(13,7) = 10.1;

SELECT RIGHT('0000000000000' + CONVERT(varchar(13),CONVERT(bigint,(@d * 10000000))),13);

虽然在这里使用我的水晶球。

编辑:由于某种原因,OP正在存储一个decimal作为varchar(这是一个非常坏的主意,它自己),我有添加了进一步的逻辑,尝试首先将值转换为decimal

正如经验告诉我们许多人一样,给用户一个非数字列来存储数值,并且他们非常乐意在其中存储非数字值,所以我使用过TRY_CONVERT并假设您使用的是SQL Server 2012 +:

DECLARE @d varchar(13) = 10.1;

SELECT RIGHT('0000000000000' + CONVERT(varchar(13),CONVERT(bigint,(TRY_CONVERT(decimal(13,7),@d) * 10000000))),13);

答案 1 :(得分:0)

SELECT REPLICATE('0',6-LEN(SUBSTRING(CAST([data] AS VARCHAR), 1, 
       CHARINDEX('.',CAST([data] AS VARCHAR)) -1)))+SUBSTRING(CAST([data] AS VARCHAR), 1, 
       CHARINDEX('.',CAST([data] AS VARCHAR)) -1)+
       SUBSTRING(CAST([data] AS VARCHAR), CHARINDEX('.',CAST([data] AS VARCHAR)) + 1, 
       LEN(CAST([data] AS VARCHAR)))+REPLICATE('0',7-LEN(SUBSTRING(CAST([data] AS VARCHAR), CHARINDEX('.',CAST([data] AS VARCHAR)) + 1, 
       LEN(CAST([data] AS VARCHAR))))) AS Whole
       FROM Table1

<强>输出

Whole
0000101000000

<强>演示

  

http://sqlfiddle.com/#!18/8649d/16

答案 2 :(得分:0)

您可以使用一些数学和字符串操作来执行此操作,如下所示

see live demo

declare @var decimal(10,4)

set @var=10.1

select @var, 
right(cast(cast(( floor(@var)+  power(10,7)) as int) as varchar(13)),6)
    +
cast(cast(((@var- floor(@var)) * power(10,7)) as int) as varchar(13))

答案 3 :(得分:0)

这里要进行大量的字符串操作。我会逐步完成我的工作。

我使用了一个变量作为基数,所以我可以验证不同的结果:

>>> set(re.findall(r'Python (\w+)', s))
{'Software', 'is', 'has', 'interpreters', 'code', 'features'}

你需要在小数点左边有6个空格,在右边需要7个空格,所以我在VARCHAR(13)上进行所有操作。我没有创建一个新变量作为VARCHAR,因为我假设您希望能够在运行中进行这种转换,所以我一遍又一遍地使用该CAST。 / p>

首先找到小数位。

declare @n decimal(9,3) = 10.1

在样本编号中,该值为3,但显然可能会发生变化。

现在,获取小数点左侧的数字部分。

SELECT CHARINDEX('.',CAST(@n as VARCHAR(13)))

然后得到小数点右边的部分。

SELECT SUBSTRING(CAST(@n as VARCHAR(13)),1,CHARINDEX('.',CAST(@n as VARCHAR(13)))-1)

填充前导零。将6打开,连接,然后右移6.在小数点左边没有数字的帐户。

SELECT SUBSTRING(CAST(@n as VARCHAR(13)),CHARINDEX('.',CAST(@n as VARCHAR(13)))+1,LEN(CAST(@n as VARCHAR(13))))

填充尾随零。同样的想法,但在另一个方向。

SELECT RIGHT(REPLICATE(0,6) + SUBSTRING(CAST(@n as VARCHAR(13)),1,CHARINDEX('.',CAST(@n as VARCHAR(13)))-1), 6)

然后把它们放在一起。

SELECT LEFT(SUBSTRING(CAST(@n as VARCHAR(13)),CHARINDEX('.',CAST(@n as VARCHAR(13)))+1,LEN(CAST(@n as VARCHAR(13)))) + REPLICATE(0,7),7)

结果。

SELECT RIGHT(REPLICATE(0,6) + SUBSTRING(CAST(@n as VARCHAR(13)),1,CHARINDEX('.',CAST(@n as VARCHAR(13)))-1), 6) 
+ 
LEFT(SUBSTRING(CAST(@n as VARCHAR(13)),CHARINDEX('.',CAST(@n as VARCHAR(13)))+1,LEN(CAST(@n as VARCHAR(13)))) + REPLICATE(0,7),7)

答案 4 :(得分:0)

声明@var varchar(20)=&#39; 10000.112&#39;

SELECT FORMAT(FLOOR(@var),&#39; 000000&#39;)+ left((PARSENAME(@ var,1))+ replicate(&#39; 0&#39;,7),7)