我想将文本存储为浮点数。我的问题是,这个文本有不同的格式,我不能影响它。我的 TEXT 列包含类似的字符串
357000
218000.56
500.000.00
转换前两个字符串没有问题。我确实在转换最后一个时遇到问题,因为小数点与千位分隔符是相同的字符。
我应该如何处理这个问题?是否使用我可以定义的格式将字符串显式转换为浮点数?
编辑:我忘了说,在上述情况下,最后一个 . (如果有的话)如果后跟两位数字,则始终是小数分隔符。因此,例如,“153.650”应转换为 153650。
我想将文本存储为浮点数。我的问题是,这个文本有不同的格式,我不能影响它。我的 TEXT 列包含类似的字符串
357000
218000.56
500.000.00
转换前两个字符串没有问题。我确实在转换最后一个时遇到问题,因为小数点与千位分隔符是相同的字符。
我应该如何处理这个问题?是否使用我可以定义的格式将字符串显式转换为浮点数?
编辑:我忘了说,在上述情况下,最后一个 . (如果有的话)如果后跟两位数字,则始终是小数分隔符。因此,例如,“153.650”应转换为 153650。
“编辑:我忘了说,在上述情况下,最后一个 . (如果有的话)总是 >decimal 分隔符,如果它后面跟着一个两位数的数字。所以,'153.650' 应该转换为 >153650例子。”
这就是你的答案。
检查索引处的字符 (yourString.Length - 3) 是否是您的分隔符之一。如果是,那么你有一个十进制值;如果没有,你不会。继续删除所有无关的符号,然后在正确的索引处重新插入您选择的小数分隔符。
干净的?不,但情况很糟糕,TBH。
你可以试试这个
CONVERT(
REPLACE(REPLACE(value, '.', ''), ',', '.'),
DECIMAL(10,2))
这将取代 . 并且,从您的字符串中,并将其转换为十进制 (10,2)。根据您的
SELECT
IF(
LENGTH(
SUBSTRING_INDEX('351.000', '.', - 1)
) >= "3",
CONVERT(
REPLACE("351.000", ".", ''),
DECIMAL (10, 2)
),
CONVERT(
CONCAT(
REPLACE(
LEFT(
'351.000',
LENGTH("351.000") - LOCATE('.', REVERSE("351.000"))
),
'.',
''
),
CONCAT(
".",
SUBSTRING_INDEX('351.000', '.', - 1)
)
),
DECIMAL (10, 2)
)
)
我试过了
1234.56 给 1234.56
1234.000.00 给出 1234000.00
和 1234.000 给出 1234000
但这不是在 mysql 查询中做这么多的好方法。你应该在编程部分处理它
在将数据提供给 SQL 之前更正数据 - 编程语言更简单,例如使用正则表达式替换。
s = s.replaceAll("\\D(\\d\\d\\d)", "$1").replaceFirst("\\D". ".");
(不考虑符号!)它首先删除非数字,然后是三个数字,然后从第一个剩余的非数字中取出一个句点。可以做得更聪明。
以上是Java,但正则表达式存在于所有明智的编程语言中。
MySQL 5.5.32 架构设置:
CREATE TABLE Table1
(`TEXT` varchar(10))
;
INSERT INTO Table1
(`TEXT`)
VALUES
('357000'),
('218000.56'),
('500.000.00')
;
查询 1:
SELECT CAST(concat(
REPLACE(CASE WHEN substr(TEXT,-3,1) = "." THEN substr(TEXT,1,length(TEXT)-3)
ELSE TEXT END,'.',''),
CASE WHEN substr(TEXT,-3,1) = "." THEN right(TEXT,3)
ELSE '' END) AS decimal(12,2)
) AS Amount
FROM Table1
结果:
| AMOUNT |
|-----------|
| 357000 |
| 218000.56 |
| 500000 |