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
Foi útil?

Solução

<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
prints
result: 123-456-789

http://php.net/wordwrap

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";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top