Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DeividMG18

[Resolvido] converter string em numero decimal

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

<?php

$content = " 007841PQUEIJOVIMILK PRATO 0000215000";

$pattern = array( 
'/^([0-9]{6})/',
'/([A-ZÀ-Ú\s]+)/',
'/([0-9]{10})$/'
);
list( $codigo, $produto, $preco ) = explode( '|', rtrim( preg_replace( $pattern, '$1|', trim( $content ) ), '|' ) );

$integer = substr( $preco, 0, -5 );
$decimal = substr( $preco, strlen( $preco ) - 5 );

echo 'Código: ', $codigo, '<br/>',
    'Produto: ', $produto, '<br/>',
    'Preço: ', number_format( sprintf( '%d.%u', $integer, $decimal ), 2, ',', '.' );

 

Saída

Código: 007841
Produto: PQUEIJOVIMILK PRATO 
Preço: 2,15

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 ) ), '|' ) );

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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
------------------------------

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.