删除前导零和尾随零并将结果保留到小数点后两位
Posted
技术标签:
【中文标题】删除前导零和尾随零并将结果保留到小数点后两位【英文标题】:Removing leading and trailing zeros and have the result in two decimal places 【发布时间】:2020-01-27 19:23:37 【问题描述】:我想删除前导零和尾随零,并希望将结果保留到小数点后两位。例如:如果数字是0.01,我想看0.01;如果数字是 0.010,我想看 .01;如果数字是 0.10,我想看到 .10;如果数字是 1,我想看到 1.00。
我会使用FORMAT
函数。
例如:
SELECT FORMAT (0.090, '#.######')
工作正常,它显示 .09
但是,当我对大于 1 的值使用相同的语句时,它不会显示小数位。
例如:
SELECT FORMAT (10, '#.######')
在我期待 10.00 时给出 10
我试图使用CASE
语句来解决这个问题,但徒劳无功。 case 语句适用于大于 1 的值,但它不会删除前导零。
DECLARE @a float = 10
SELECT
CASE
WHEN @a <1 THEN format (@a, '#.######')
ELSE CAST(FORMAT(@a, '#.######') AS money)
END
按照我的预期给出 10.00。但是,例如,当 @a 的值为 0.090 时,它给出 0.09 而我期望 .09
有什么方法可以删除尾随零和前导零并将结果保留到小数点后两位?非常感谢任何指南。
【问题讨论】:
格式化是 display 层的职责。我的建议是在 SQL 中返回原始数据并配置显示(表单、网页、报告等)以显示您想要的数字。 【参考方案1】:虽然我同意 D Stanley 的观点,即“格式化是显示层的责任”,但我知道有时您需要在存储过程或其他函数中使用一些脏函数。试试这个:
CREATE FUNCTION dbo.toStr(@a float)
RETURNS varchar(12)
AS
BEGIN
DECLARE @ret varchar(12)
SELECT @ret =
CASE
WHEN @a < 1 THEN replace(format(@a, '.##'), '0.','.')
ELSE FORMAT(@a, '#.00')
END
RETURN @ret
END;
我已使用以下值进行了测试:
select dbo.toStr(0.090); -- .09
select dbo.toStr(1.09); -- 1.09
select dbo.toStr(10.00); -- 10.00
select dbo.toStr(1.2); -- 1.20
【讨论】:
谢谢。我将 .## 稍微修改为 .######,因为它会减少更大的数字。以上是关于删除前导零和尾随零并将结果保留到小数点后两位的主要内容,如果未能解决你的问题,请参考以下文章