Eu tenho uma string, digamos '123'
, e quero convertê-la para o número inteiro 123
.
Eu sei que você pode simplesmente fazer some_string.to_i
, mas isso se converte 'lolipops'
em 0
, o que não é o efeito que tenho em mente. Quero explodir na minha cara quando tento converter algo inválido, com uma agradável e dolorosa Exception
. Caso contrário, não consigo distinguir entre um válido 0
e algo que simplesmente não é um número.
Edição: Eu estava procurando a maneira padrão de fazê-lo, sem truques regex.
^
e$
têm significados sutilmente diferentes como metacarpos do que na maioria dos outros sabores de expressões regulares. Você provavelmente pretende usar\A
e em\Z
vez disso.\z
no lugar de,\Z
pois a descrição da âncora Z maiúscula é: "Corresponde ao final da string. Se a string termina com uma nova linha, ela corresponde imediatamente antes da nova linha" - ruby-doc.org/core-2.1.1/Regexp .htmlTambém esteja ciente dos efeitos que a solução atualmente aceita pode ter na análise de números hexadecimais, octais e binários:
Nos números Ruby, que começam com
0x
ou0X
são hexadecimais0b
ou0B
binários e0
são octais. Se esse não for o comportamento desejado, convém combiná-lo com algumas das outras soluções que verificam se a sequência corresponde primeiro a um padrão. Como as/\d+/
expressões regulares, etc.fonte
Outro comportamento inesperado com a solução aceita (com 1,8, 1,9 está ok):
portanto, se você não tiver certeza do que está sendo transmitido, adicione a
.to_s
.fonte
I como a resposta de Myron mas sofre da doença de Ruby de "eu já não usar Java / C # para que eu nunca vou herança uso novamente" . A abertura de qualquer classe pode estar repleta de perigos e deve ser usada com moderação, especialmente quando faz parte da biblioteca principal do Ruby. Não estou dizendo que nunca o use, mas geralmente é fácil evitar e que existem melhores opções disponíveis, por exemplo
Então, quando você deseja usar uma string que possa ser um número, fica claro o que você está fazendo e você não derruba nenhuma classe principal, por exemplo,
Você pode adicionar todos os tipos de outras verificações na inicialização, como verificar números binários etc. O principal, porém, é que Ruby é para pessoas e ser para pessoas significa clareza . Nomear um objeto por meio de seu nome de variável e nome de classe torna as coisas muito mais claras.
fonte
Eu tive que lidar com isso no meu último projeto, e minha implementação foi semelhante, mas um pouco diferente:
fonte
Provavelmente não é a maneira mais limpa de fazer isso, mas deve funcionar.
fonte
Re: Resposta de Chris
Sua implementação permite coisas como "1a" ou "b2". Que tal isso:
Isso gera:
fonte
\z
no lugar de,\Z
pois a descrição da âncora Z maiúscula é: "Corresponde ao final da string. Se a string termina com uma nova linha, ela corresponde imediatamente antes da nova linha" - ruby-doc.org/core-2.1.1/Regexp .html