Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
boa tarde galera,
estou puchando dados de um arquivo usando expressoes regulares (nome do produto,preço e codigo) porem na hora de formatar nao to conseguindo transformar os numeros corretamente com o padrao.
linha de exemplo:
$dado = " 007841PQUEIJOVIMILK PRATO 0000215000";
$padrao_produto= '/[A-Z.+ \/]{1,21}/';
$resultado_produto =preg_match($padrao_produto, $dado,$matches_produto);
echo'
[b]produto[/b]'.substr($matches_produto[0],1).'
';
$padrao_preco ='/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]{1,10}/';
$resultado_preco= preg_match($padrao_preco, $dado,$matches_preco);
echo 'preco'.substr($matches_preco[0],3,4).'
';
$padrao_codigo ='/[0-9]{1,6}/';
$resultado_codigo = preg_match($padrao_codigo,$dado,$matches_codigo);
echo '[b]código[/b]'.$matches_codigo[0].'
';
?>
eu estava tentando que a string que retorna em preco 0215 se torne 2,15 porem nao estou conseguindo...alguem sabe ?uma dica?obrigado
valew resolvido! estava quebrando a cabeça para separar os inteiros de decimais.
carlos obrigado pela ajuda você poderia me explicar essa linhas? nao entendi o "|".
list( $codigo, $produto, $preco ) = explode( '|', rtrim( preg_replace( $pattern, '$1|', trim( $content ) ), '|' ) );
Primeiro usei o | como separador dos valores e removi o último da direita.
Ficaria assim:
007841|PQUEIJOVIMILK PRATO|0000215000
depois fiz um explode no |.
Ficaria assim:
array
0 => string '007841' (length=6)
1 => string 'PQUEIJOVIMILK PRATO ' (length=20)
2 => string '0000215000' (length=10)carlos nesta linha esta retornando o seguinte:
$linha="000144UPAO C FRUTAS 490 GR 0000369030";
Código: 000144
Produto: UPAO C FRUTAS
Preço: 490,00
nao estou conseguindo ficar desse jeito
Código: 000144
Produto: UPAO C FRUTAS 490 GR
Preço: 3,69
Não está dando certo porque o padrão mudou!
No seu primeiro post, você não tinha informado que poderia ter números no nome do produto, então, o padrão que montei não irá casar em alguns casos.
Vamos bolar outra forma de resolver este problema.
Pelo que pude perceber, temos dois padrões que não mudam, o código do produto(6 caracteres iniciais) e o valor(10 caracteres finais). Certo?
Com base nisso, vamos tentar fazer um script que não envolva Expressão Regular.
Primeiro vamos "pegar" o código:
$codigo = substr( $line, 0, 6 );
Depois o produto:
$produto = substr( $line, 6, strlen( $line ) - 16 );
E por último o preço:
$preco = substr( $line, strlen( $line ) - 6 );
Pronto, o script já está funcionando.
$lines = array(
' 007841PQUEIJOVIMILK PRATO 0000215000',
' 000144UPAO C FRUTAS 490 GR 0000369030 '
);
foreach( $lines as $line )$line = trim( $line );
$codigo = substr( $line, 0, 6 );
$produto = substr( $line, 6, strlen( $line ) - 16 );
$preco = substr( $line, strlen( $line ) - 6 );
echo 'Código: ', $codigo, '<br/>',
'Produto: ', $produto, '<br/>',
'Preço: ', number_format( sprintf( '%d.%u', substr( $preco, 0, -5 ), substr( $preco, strlen( $preco ) - 5 ) ), 2, ',', '.' );
echo '<hr>';
}
Saída
Código: 007841
Produto: PQUEIJOVIMILK PRATO
Preço: 2,15
------------------------------
Código: 000144
Produto: UPAO C FRUTAS 490 GR
Preço: 3,69
------------------------------
perfeito...vlw
Primeiro você tem que descobrir se os cinco(5) últimos números sempre serão as casas decimais.
Se este for um padrão, daí fica fácil montar um script para fazer o que você quer.
$pattern = array(
'/^([0-9]{6})/',
'/([A-ZÀ-Ú\s]+)/',
'/([0-9]{10})$/'
Saída
Código: 007841
Produto: PQUEIJOVIMILK PRATO
Preço: 2,15