Pergunta
Eu quero saber se existe alguma maneira de texto dividido assim:
123456789 em 123-456-789
como adicionar "-" após cada 3 caracteres
Apenas queria saber, como eu sei que o inverso, mas como fazer isso é sobre a minha cabeça. ;)
e também se o texto é
ABCDEFGHI OR A1B2C3D4E or any other format
without any space between the characters !
languge : PHP only
Solução
<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
printsresult: 123-456-789
Outras dicas
Eu não sou um grande fã de expressões regulares para a extração simples string (extrações de comprimento especialmente fixos), preferindo-los para coisas um pouco mais complexo. Quase todas as línguas tem uma função substring assim, presumindo a sua entrada já foi validado, um simples (pseudo-código desde que você não tenha especificado um idioma):
s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)
Se você quer que ele a cada três caracteres para uma cadeia de comprimento variável (com dimensão ímpar no final):
t = ""
sep = ""
while s != "":
if s.len <= 3:
t = t + sep + s
s = ""
else:
t = t + sep + substring (s,0,3)
s = substring (s,3)
sep = "-"
s = t
Para qualquer idioma:
- Crie uma variável de cadeia vazia chamado de "resultado"
- Crie uma variável de contador inteiro, "i", que incrementos até que o comprimento da ORIGINAL string (aquele com o número)
- Anexar cada personagem da string original para "resultado"
- Se i módulo 3 (geralmente% ou mod) é zero, acrescentar uma pitada de "resultado"
No interesse da completude, aqui está uma solução Python:
>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'
Uma vez que você atualizou sua pergunta para especificar uma solução PHP, isso deve funcionar:
substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)
substr
para obter mais informações sobre esta função. Isso vai trabalhar não só para dígitos, mas para caracteres alfabéticos também.
No entanto, outra versão Python:
>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789
Eu acho que isso pode ser sensatamente feito em um regex com lookahead:
s/(.{3})(?=.)/$1-/g
Uma vez que você mencionou PHP em um comentário:
preg_replace ("/(.{3})(?=.)/", "$1-", $string);
editar : Após VolkerK mostrou wordwrap
, achei chunk-split
na documentação:
$new_string = chunk_split ($string, 3, '-');
Isto tem a vantagem de que também funciona quando existem espaços na seqüência (wordwrap prefere quebrar a espaços).
Em Perl:
#!/usr/bin/perl
use strict;
use warnings;
my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;
print "$1-$2-$3"
Você pode fazê-lo com (entre outros meios) uma expressão regular e substituir. A sintaxe exata depende do idioma da ferramenta ou de programação que você está usando. Por exemplo, uma maneira de fazê-lo em Perl seria
$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;
Linha 2 substitui a cada 3 dígitos para os mesmos 3 dígitos e um traço. Com costeleta () temos de eliminar o traço de fuga.
Há uma outra pergunta aqui. O que fazer quando a string não contém um múltiplo de 3 quantidade de dígitos? Se essas cordas foram autorizados, em seguida, o trecho acima precisaria modificação.
Além disso, dependendo das especificidades do caso, que você pode ir longe com a substituição substring simples, ou corte string.
Um exemplo mais Perl. Isto não remove grupos finais menores do que três, e que deixa os grupos iniciais de menos de três dígitos sozinho. É baseado (muito vergonhosamente) sobre os "números dinheiro" exemplo em Learning Perl (página 212 da 5ª ed):
#!/usr/bin/env perl
use strict;
use warnings;
print "Gimme' a number: ";
chomp(my $number = <STDIN>);
1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);
print "Now it's $number\n";