所以,如果我有一个数据(varchar),比如说10.1
我需要将值0000101000000
。
表示(000010)整数和(1000000)十进制值。
它是一个13个字符的字符串,小数点前的数字应该是前6个字符,小数点后面的数字应该是最后7个字符
答案 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
<强>演示强>
答案 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)