将 VarChar 转换为具有不同文化格式的浮点数
Posted
技术标签:
【中文标题】将 VarChar 转换为具有不同文化格式的浮点数【英文标题】:Convert VarChar to Float with different culture format 【发布时间】:2017-10-19 08:49:56 【问题描述】:我从不同的外部来源获得了一些数字位于 NVarChar 字段中的数据。到目前为止,我使用带有 CAST 的 REPLACE 来确保带有“,”的数字以正确的方式投射。像这样:
select cast(replace('12,5',',','.') as float)
select cast(replace('12.5',',','.') as float)
这工作得很好,但现在我得到的数据也有千位分隔符。像这样:
select cast(replace('2.012,5',',','.') as float)
select cast(replace('2,012.5',',','.') as float)
它坏了。 有没有办法检测带有数字的 NVarChar 中使用了哪种数据格式?
我曾尝试将 TRY_PARSE 与文化参数一起使用,如果有千位分隔符则效果很好,但不是没有:
SELECT @Fuelunits =
CASE
WHEN ISNUMERIC(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL')) = 1
THEN CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'nl-NL') AS FLOAT)
ELSE CAST(TRY_PARSE(@Hoeveelheid AS decimal(9,2) USING 'en-US') AS FLOAT)
END
问题是我必须在 UPDATE 中使用它,并且同一个表中的数据格式可能不同。
有什么建议吗?
【问题讨论】:
在这里告诉我们您真正需要的格式。看来你来回走动了。 【参考方案1】:您可以使用CHARINDEX()
来计算存在哪些分隔符以及它们在字符串中的位置以及CASE
表达式来处理REPLACE
和CAST
到FLOAT
之前的不同情况:
CREATE TABLE #vals (val NVARCHAR(10));
INSERT INTO #vals
(
val
)
VALUES
(N'2.012,5'),
(N'2,012.5');
SELECT CAST(CASE
-- is there a '.' in a position before a ','?
WHEN CHARINDEX('.', val) < CHARINDEX(',', val) THEN
-- yes - remove the '.' and replace the ',' with '.'
REPLACE(REPLACE(val, '.', ''), ',', '.')
ELSE
-- no - just remove the ','
REPLACE(v.val, ',', '')
END AS FLOAT)
FROM #vals AS v;
DROP TABLE #vals;
参考资料:
CHARINDEX (Transact-SQL)
在表达式中搜索另一个表达式,如果找到则返回其起始位置。
【讨论】:
谢谢 Tanner 我使用了你的解决方案。我不知道为什么我自己没有看到这个选项,也许我太专注于寻找具有某种文化背景的功能。 我认为总的来说没有解决办法。例如,如果存储 3 位小数,如果存在多种文化,如何区分 1,234 和 1.234?以上是关于将 VarChar 转换为具有不同文化格式的浮点数的主要内容,如果未能解决你的问题,请参考以下文章
将包含数值的字符串转换为具有不同区域性设置的相同字符串,同时保留原始格式