Converte string com vírgula em inteiro

95

Existe algum método bacana para converter "1.112" em inteiro 1112, em vez de 1?

Eu tenho um, mas não legal:

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

Respostas:

175

Que tal agora?

 "1,112".delete(',').to_i
Michael Kohl
fonte
Obrigado pela sua resposta. É muito melhor que o meu. Na verdade, esperava que houvesse uma ligação em vez de duas. como: "1.112" .to_money. Depois de revisar as respostas, é provável que esse método não exista. De qualquer forma, muito obrigado!
mCY
@michealKohi você pode me dizer Por que delete () é muito mais rápido do que fazer o mesmo no gsub que aceita regex, eu sempre pensei que a maneira de regex é mais rápida. Eu executei o Benchmark em ambos, pois é uma grande diferença no tempo de execução.
Abhinay
1
@Abhinay Em relação aos seus benchmarks: tamanho da amostra? Tamanho da corda?
Michael Kohl
5

Você também pode querer ter certeza de que seu código está localizado corretamente ou de que os usuários estejam acostumados com a notação "internacional". Por exemplo, "1.112" na verdade significa números diferentes em países diferentes. Na Alemanha, significa o número um pouco mais de um, em vez de mil e algo assim.

O artigo da Wikipedia correspondente está em http://en.wikipedia.org/wiki/Decimal_mark . Parece estar mal escrito neste momento. Por exemplo, como um chinês, não tenho certeza de onde vêm essas descrições sobre o separador de milhar na China.

Yì Yáng
fonte
4

Alguns mais convenientes

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

faz "1 200 200" funcionar corretamente também

Alexey Novikov
fonte
8
Melhor ainda '1,1200.00'.gsub(/[^0-9\.]/,'').to_f.
Hauleth
7
Espera, por que você deseja converter "1,1200.00"para "1120000"? Você não deseja apenas substituir o ,(ou, dependendo do local, o .)? Além disso, isso não o converte em um inteiro ou float, apenas uma string sem delimitadores.
brymck
3
@Bryan: Para arriscar um palpite, você pode querer fazer isso em um aplicativo bancário, ao converter um valor em moeda que o usuário inseriu, para lidar apenas com números inteiros dentro do aplicativo: por exemplo, converter dólares e centavos em centavos . Este método evitará quaisquer erros de arredondamento que podem surgir inesperadamente ao lidar com números de ponto flutuante. Quando o valor de uma moeda precisa ser mostrado ao usuário, o valor em centavos pode ser convertido em dólares e centavos. (Embora não seja sobre isso que o questionador perguntou.)
Teemu Leisti
2
Essa resposta nem mesmo aborda a solicitação do autor da pergunta para converter a string em um inteiro ou float.
LS
2

A seguir está outro método que funcionará, embora, como com alguns dos outros métodos, retire as casas decimais.

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

Eu faria usando String#tr:

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

Se alguém quer sublinhar mais do que uma vírgula, sou fã de:

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

não sei sobre o desempenho, mas é mais flexível do que um gsub, ou seja:

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