将 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 表达式来处理REPLACECASTFLOAT 之前的不同情况:

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 转换为具有不同文化格式的浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何将小数字转换为python中的浮点数? [复制]

如何将列表中的字符串值更改为 Python 中的浮点数

将范围-1到1的浮点数转换为短的快速方法?

将包含数值的字符串转换为具有不同区域性设置的相同字符串,同时保留原始格式

无法将字符串转换为 pandas 中的浮点数(ValueError)

如何格式化具有最大小数位数且没有额外零填充的浮点数?