Konvertieren Sie eine Zeichenfolge mit Komma in eine Ganzzahl

95

Gibt es eine nette Methode, um "1.112" in eine ganze Zahl 1112 anstelle von 1 umzuwandeln?

Ich habe eine, aber nicht ordentlich:

"1,112".split(',').join.to_i #=> 1112
mCY
quelle

Antworten:

175

Wie wäre es damit?

 "1,112".delete(',').to_i
Michael Kohl
quelle
Danke für deine Antwort. Es ist viel besser als meins. Tatsächlich hatte ich gehofft, dass es einen Anruf statt zwei geben würde. wie: "1.112" .to_money. Nach Durchsicht der Antworten gibt es wahrscheinlich keine solche Methode. Trotzdem vielen Dank!
mCY
@michealKohi Kannst du mir sagen, warum delete () viel schneller ist als dasselbe in gsub, das Regex akzeptiert? Ich habe immer gedacht, dass Regex schneller ist. Ich habe Benchmark für beide ausgeführt, da es einen großen Unterschied in der Ausführungszeit gibt.
Abhinay
1
@Abhinay Bezüglich Ihrer Benchmarks: Stichprobengröße? Stringgröße?
Michael Kohl
5

Möglicherweise möchten Sie auch sicherstellen, dass Ihr Code korrekt lokalisiert ist, oder dass die Benutzer an die "internationale" Notation gewöhnt sind. Zum Beispiel bedeutet "1.112" tatsächlich unterschiedliche Zahlen in verschiedenen Ländern. In Deutschland bedeutet das etwas mehr als eins statt tausend und so.

Der entsprechende Wikipedia-Artikel befindet sich unter http://en.wikipedia.org/wiki/Decimal_mark . Es scheint jedoch zu diesem Zeitpunkt schlecht geschrieben zu sein. Als Chinese bin ich mir zum Beispiel nicht sicher, woher diese Beschreibung über tausend Trennzeichen in China stammt.

Yì Yáng
quelle
4

Einige bequemer

"1,1200.00".gsub(/[^0-9]/,'') 

Dadurch funktioniert "1 200 200" ebenfalls ordnungsgemäß

Alexey Novikov
quelle
8
Noch besser ist '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth
7
Warten Sie, warum sollten Sie konvertieren möchten "1,1200.00"zu "1120000"? Wollen Sie nicht einfach das ,(oder, je nach Gebietsschema, das .) ersetzen ? Dies konvertiert es auch nicht in eine Ganzzahl oder ein Float, sondern nur in eine Zeichenfolge ohne Trennzeichen.
Brymck
3
@Bryan: Um eine Vermutung zu wagen, möchten Sie dies möglicherweise in einer Bankanwendung tun, wenn Sie einen vom Benutzer eingegebenen Währungsbetrag umrechnen, um nur Ganzzahlen innerhalb der Anwendung zu verarbeiten: zum Beispiel die Umrechnung von Dollar und Cent in Cent . Diese Methode vermeidet Rundungsfehler, die beim Umgang mit Gleitkommazahlen unerwartet auftreten können. Wenn dem Benutzer ein Währungsbetrag angezeigt werden muss, kann der Cent-Betrag in Dollar und Cent umgerechnet werden. (Obwohl der Fragesteller nicht danach gefragt hat.)
Teemu Leisti
2
Diese Antwort geht nicht einmal auf die Anfrage des Fragestellers ein, die Zeichenfolge in eine Ganzzahl oder ein Float umzuwandeln.
LS
2

Das Folgende ist eine andere Methode, die funktioniert, obwohl sie wie bei einigen anderen Methoden Dezimalstellen entfernt.

a = 1,112
b = a.scan(/\d+/).join().to_i => 1112
Mahesh
quelle
1

Ich würde tun mit String#tr:

"1,112".tr(',','').to_i # => 1112
Arup Rakshit
quelle
1

Wenn jemand mehr als ein Komma ausgeben möchte, bin ich ein Fan von:

"1,200".chars.grep(/\d/).join.to_i

Keine Ahnung von Leistung, aber es ist flexibler als a gsub, dh:

"1-200".chars.grep(/\d/).join.to_i
davidpm4
quelle
0
String count = count.replace(",", "");
Ajay Rathore
quelle