2013-09-09 3 views
1

Я хочу сохранить текст в виде поплавка. Моя проблема заключается в том, что этот текст поставляется в разных форматах, и я не могу повлиять на это. Моя колонка TEXT содержит строки, какПреобразование текста в float, когда текст поступает в разных форматах

218000,56

500.000.00

У меня нет проблемы преобразования первых двух строк. У меня проблема с преобразованием последнего, потому что десятичная метка имеет тот же символ, что и разделитель тысяч.

Как мне решить эту проблему? Является ли явная строка преобразования для float с использованием формата, который я могу определить?

EDIT: Я забыл сказать, что в вышеуказанных случаях последний. (если он есть) всегда является десятичным разделителем, если за ним следует двузначный номер. Итак, «153.650» должен, например, преобразовать в 153650.

+0

Это непростая задача решить, если нет ограничений на формат ввода. «500.000.000» означает 5.00000000 x 10^5 или 5 x 10^8? Обычно используется «,» как разделитель тысяч и «.». для десятичной точки или наоборот. Использование одного и того же символа для одного и того же номера больше похоже на ошибку, которая должна быть исправлена, а не работать. – chepner

+0

Вы правы. Это ошибка пользователя, но я не могу этого предотвратить. Я хочу найти способ распознать правильный номер. – flo

+0

Просто предположите, что вы можете вставить в другую таблицу все строки с 2 точками и более, удалить их и преобразовать их в то, что вам нужно. Я сомневаюсь, что есть решение, которое будет работать во всех форматах. – Mihai

ответ

1

EDIT: Я забыл сказать, что в вышеуказанных случаях последний (если есть) всегда является десятичным разделителем, если за ним следует двузначный номер. Итак, '153.650' должен конвертировать в> 153650, например ».

Есть ваш ответ.

Проверьте, является ли символ с индексом (yourString.Length - 3) одним из ваших разделителей. Если это так, значит, у вас есть десятичное значение; если нет, вы этого не сделаете. Продолжайте снимать все посторонние символы, а затем снова вставляйте свой выбор десятичного разделителя с правильным индексом.

Чистый? Нет. Но ситуация воняет, TBH.

+0

Я знаю, что ситуация воняет :) Цените свой вклад в любом случае, я придумаю что-то вроде вас, спасибо. – flo

0

вы можете попробовать это

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. вы должны обращаться с ним в программирующей части

+0

Спасибо за ваш ответ, но ваш код приводит к 35184250.00, когда я хочу конвертировать «351842,50». В этом случае это должно привести к 351842.50. – flo

+0

, но если есть два десятичных разряда, то какой из них будет рассмотрен. Затем я изменю свою функцию – developerCK

+0

Проблема заключается в том, что могут быть такие строки, как «1.400.000.00», «100.000», «100.000.23» и «100000.23». Результаты должны быть: 1400000, 100000,100000.23 и 100000.23 – flo

0

Исправить данные перед их предоставлением SQL - язык программирования проще, например, с помощью замены регулярного выражения.

s = s.replaceAll("\\D(\\d\\d\\d)", "$1").replaceFirst("\\D". "."); 

(Который не считает знаки!) Это первое удаляет нецифровые следует три цифры, а затем сделать период из первой оставшейся нецифры. Можно сделать умнее.

Вышеупомянутая Java, но регулярное выражение существует во всех разумных языках программирования.

+0

Спасибо ... Я только могу использовать Javascript, и кажется, что функция replaceAll и replaceFirst не существует :( – flo

+0

JavaScript: 's = s.replace (/ \\ D (\\ d \\ d \\ d/g, '$ 1'). заменить (/ \\ D /, '.');' –

+0

hm no that did not работа, когда я пытаюсь «1.400.000.00» – flo

0

SQL Fiddle

MySQL Setup 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 

Results:

| AMOUNT | 
|-----------| 
| 357000 | 
| 218000.56 | 
| 500000 |