Convertir cadena con coma a entero

95

¿Existe algún método sencillo para convertir "1112" en un número entero 1112, en lugar de 1?

Tengo uno, pero no ordenado:

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

Respuestas:

175

¿Qué tal esto?

 "1,112".delete(',').to_i
Michael Kohl
fuente
Gracias por tu respuesta. Es mucho mejor que el mío. De hecho, esperaba que hubiera una llamada en lugar de dos. como: "1,112" .to_money. Después de revisar las respuestas, es probable que no exista tal método. De todos modos, ¡muchas gracias!
mCY
@michealKohi, ¿puedes decirme por qué delete () es mucho más rápido que hacer lo mismo en gsub que acepta expresiones regulares? Siempre he pensado que la forma de expresiones regulares es más rápida. He ejecutado Benchmark en ambos por su gran diferencia en el tiempo de ejecución.
Abhinay
1
@Abhinay Con respecto a sus puntos de referencia: ¿tamaño de la muestra? ¿Tamaño de cadena?
Michael Kohl
5

También puede asegurarse de que su código se localice correctamente o asegurarse de que los usuarios estén acostumbrados a la notación "internacional". Por ejemplo, "1112" en realidad significa números diferentes en diferentes países. En Alemania significa el número un poco más de uno, en lugar de mil y algo.

El artículo de Wikipedia correspondiente se encuentra en http://en.wikipedia.org/wiki/Decimal_mark . Sin embargo, parece estar mal escrito en este momento. Por ejemplo, como chino, no estoy seguro de dónde viene esta descripción sobre el separador de miles en China.

Yì Yáng
fuente
4

Algunos mas convenientes

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

hace que "1200200" funcione correctamente también

Alexey Novikov
fuente
8
Aún mejor es '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth
7
Espera, ¿por qué quiere convertir "1,1200.00"a "1120000"? ¿No solo desea reemplazar el ,(o, según la configuración regional, el .)? Además, esto no lo convierte en un número entero o flotante, solo una cadena sin delimitadores.
brymck
3
@Bryan: para aventurar una conjetura, es posible que desee hacer esto en una aplicación bancaria, al convertir una cantidad de moneda que el usuario ha ingresado, para tratar solo con números enteros dentro de la aplicación: por ejemplo, convertir dólares y centavos a centavos . Este método evitará cualquier error de redondeo que pueda surgir inesperadamente al tratar con números de punto flotante. Cuando es necesario mostrar una cantidad de moneda al usuario, la cantidad de centavos se puede convertir a dólares y centavos. (Aunque eso no es sobre lo que preguntó el interlocutor.)
Teemu Leisti
2
Esta respuesta ni siquiera aborda la solicitud del autor de la pregunta de convertir la cadena en un número entero o flotante.
LS
2

El siguiente es otro método que funcionará, aunque al igual que con algunos de los otros métodos, eliminará los lugares decimales.

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

Lo haría usando String#tr:

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

Si alguien busca sustituir más que una coma, soy fan de:

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

No sé sobre el rendimiento, pero es más flexible que a gsub, es decir:

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