# CONVERT Char in FLOAT/INT



## Termos (10. Februar 2014)

Hallo Community, ich habe folgende varchar werte

"10.500,00€"
" 500.000,80 €"
.
.
.


Habe diese mit 

```
REPLACE(REPLACE(REPLACE(REPLACE(pmw9.wert,'€',''),'.',''),',','.'),' ','')
```

in die Form 

"10500.00"
"500000.80"

gebracht und wollte jetzt mit


```
CONVERT(INT,REPLACE(REPLACE(REPLACE(REPLACE(pmw9.wert,'€',''),'.',''),',','.'),' ','')
```

Das ganze in eine Zahl umwandeln,
doch sowohl bei money, int, float bekomme ich Fehler.



SQL Server 2008


----------



## Yaslaw (10. Februar 2014)

Meine Spielwiese sagt:

```
CONVERT(NUMERIC, REPLACE(REPLACE(REPLACE(REPLACE(wert,'€',''),'.',''),',','.'),' ',''))
```

ggf. NUMERIC(10,2) etc.


----------



## BaseBallBatBoy (10. Februar 2014)

1. Welchen Fehler kriegst du denn genau?
2. Mach zur Sicherheit mal auch noch rtrim, ltrim und replace(<hier dein bisheriges repalce>, CHAR(0), '')


----------



## Termos (10. Februar 2014)

Meldung 8114, Ebene 16, Status 5, Zeile 1
Fehler beim Konvertieren des nvarchar-Datentyps in numeric.



```
CONVERT(NUMERIC(10,2),LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(pmw9.wert,'€',''),'.',''),',',''),' ',''),'EUR',''),'-',''),CHAR(0),''))))
```


leider ohne Erfolg 

langsam wird es echt übel ;( 

Gibt's ne Möglichkeit nur zahlen und Komma zuzulassen und alles andere zu "löschen"?


----------



## Yaslaw (10. Februar 2014)

Aha, jetzt kommen noch EUR dazu.
Vervollständige doch mal die Testdaten im SQL Fiddle, das ich aufgesetzt habeund poste dann den neuen Link.


----------



## Termos (11. Februar 2014)

Guten Morgen, hab das ganze mal etwas angepasst

http://sqlfiddle.com/#!3/a8d10/3

Hier sind jetzt alle Härtefälle drin, die ich sonst vor selektiere. 
Es handelt sich um ein ERP System in das eine Sachbearbeiterin Ihre "selbst erstellten" spalten eingeben kann.


----------



## Yaslaw (11. Februar 2014)

Und du musst diesen Schrott mit MS SQL 2008 lösen?
MS SQL kennt nicht mal reguläre Ausdrücke. 
Ich seh grad keine Lösung - aber ich kenn MS SQL auch nur aus der Online-Doku.

Und ist "1750.00"+250 jetzt 1750 oder 2000?

Was für eine Frontendsprache hast du. VB?


----------



## Termos (11. Februar 2014)

So sieht es aus ;/

Theoretisch kann ich die Werte anpassen bzw mit ISNUMERIC filtern.
Die 3 Textwerte kann ich auch komplett raus lassen. 
Es wundert mich nur das er schon bei "10500.00" meckert, er will den Punkt einfach nicht mit Umwandeln... ich suche mal ob der Fehler in der Codierung liegt.

Das ERP Frontend basiert auf JavaScript und HTML


----------



## Yaslaw (11. Februar 2014)

Pech. In VBA hätte ich die Funktion für dich gehabt...
VBA toDoubleGeneric() (In der neusten Version werden sogar Zahlen aus Texten herausgelesen - ist aber noch nicht online, da ich das PW zu meinem Wiki nicht im Büro hab)


----------



## Termos (11. Februar 2014)

Hmm ... Trotzdem vielen Dank! 

Ich werde mal versuchen eine Ebene höher die Konvertierung durchzuführen ...


----------



## BaseBallBatBoy (11. Februar 2014)

Welche collation brauchst du denn? SQL_Latin1_General_CP1_CI_AS? Unicode?


Zudem habe ich mal in deinem Beispiel nach den unterschiedlichen Typen gesucht und diese gefunden:

```
INSERT INTO t ([wert]) VALUES ('10500.00');
INSERT INTO t ([wert]) VALUES ('16409.80');
INSERT INTO t ([wert]) VALUES ('2326.12');
INSERT INTO t ([wert]) VALUES ('0');
INSERT INTO t ([wert]) VALUES ('1650.');
INSERT INTO t ([wert]) VALUES ('1900');
INSERT INTO t ([wert]) VALUES ('max400proMonat');
INSERT INTO t ([wert]) VALUES ('625');
INSERT INTO t ([wert]) VALUES ('1750.00+250');
```

Wenn ich mir das so anschaue, kann ich nicht verstehen, warum du denn auch Replace machst für '€', 'EUR', ',' und '-'. Ich gehe mal davon aus dein Beispiel ist nicht vollständig?


----------



## BaseBallBatBoy (11. Februar 2014)

Noch einmal ein Nachtrag:
http://sqlfiddle.com/#!3/9f8a4/5

item1: gehe iterativ vor wie in meinem Beispiel indem du die Komplexität immer weiter erhöhst.

item2: CONVERT ist SQL Server spezifisch, CAST ist ANSI. CONVERT kann noch etwas mehr beim Formatieren eines Datums, ansonsten sind sie gleich. In dem Fall brauchst du diese Funktionalität nicht und somit schlage ich vor brauche CAST.

item3: Anstelle vom Filter für non-numeric könntest du auch einen case brauchen: CASE WHEN ISNUMERIC(wert) = 1 THEN CAST(....) ELSE 0 END

item4: DECIMAL und NUMERIC sind was den SQL Server betrifft funktional gleich. Der SQL-92 Standard beschreibt decimal als 'exactly as precise as declared' und numeric als 'at least as precise as declared'. In SQL Server sind beide 'exactly as precise as declared', sprich numeric braucht nicht die Flexibilität welche der Standard erlauben würde. Somit schlage ich vor brauche DECIMAL.

item5: Da ich deine Daten nicht kenne habe ich mal geraten und DECIMAL(18,2) gewählt. Wenn du aber z.B. mehr Kommastellen hast, müsste das noch ergänzt werden.


----------

