2010-03-22 7 views
4

Je travaille avec une base de données contenant un certain nombre de numéros de série dont le préfixe est 0.Utilisation des conversions de chaînes et d'octets PHP

donc un numéro de série peut ressembler à 00032432 ou 56332432.

problème est avec PHP Je ne comprends pas comment le système de conversion avec octal fonctionne.

Un exemple spécifique est que j'essaie de convertir et de comparer tous ces nombres basés sur des nombres entiers avec des chaînes.

Est-il possible de convertir un octal, tel que 00234 en une chaîne comme "00234" pour que je puisse le comparer?

éditer - ajouter un exemple spécifique. Je voudrais pouvoir lancer des fonctions str sur la série comme ci-dessous.

$serial = 00032432; // coming from DB 

    if(substr($serial, 0, 1) == '0') { 

     // do something 

    } 
+1

Je ne comprends pas votre question? La valeur provient d'une chaîne de caractères, elle ne doit donc pas encore être traitée comme un octal jusqu'à ce que vous fassiez quelque chose de mathématique, comme l'utiliser dans un ajout.Vous devriez être capable de l'utiliser dans une comparaison de cordes, haut la main. Ou est-ce que j'ai mal compris quelque chose? –

+0

Est-il important que la valeur provenant de la base de données soit affectée à une variable avant qu'elle ne soit utilisée et comparée? Parce que je ne suis pas capable de manipuler ces variables comme je le ferais avec des nombres ou des chaînes qui n'ont pas de zéros en tête. – krx

Répondre

4

Lorsque vous convertissez avec (string) $number, vous obtenez toujours une chaîne en base décimale, il n'a pas d'importance si vous écrivez le nombre en octal mode ou en mode décimal, un int est un int et il n'a pas lui-même une base. C'est sa représentation sous forme de chaîne qui doit être interprétée avec une base.

Vous pouvez obtenir la représentation de chaîne octal d'un certain nombre de cette façon:

$str = base_convert((string) 00032432, 10, 8); 

ou de donner le nombre de représentant décimales:

$str = base_convert((string) 13594, 10, 8);  

ou, de façon plus concise, mais moins clairement:

$str = base_convert(00032432, 10, 8); 
$str = base_convert(13594, 10, 8); 

Dans la dernière, la conversion de chaîne est implicitement effectuée. Les exemples donnent tous comme résultat $ str = "32432".

base_convert convertit une représentation de chaîne d'un nombre à partir d'une base à une autre

Si vous voulez aussi les zéros dans votre chaîne, vous pouvez les ajouter avec les mathématiques simples.

J'espère que cela peut vous aider.

+0

Comment puis-je savoir s'il est octal avant d'exécuter la commande base_convert? Par exemple, je ne veux pas exécuter base_convert sur un non-octal car cela va changer la valeur. Y at-il un moyen de vérifier AVANT d'exécuter cette fonction et il modifie les valeurs? Je veux seulement l'exécuter sur les valeurs avec des zéros en tête. – krx

+0

Je ne comprends pas ce que vous voulez dire. Vous obtenez les chiffres dans un format de chaîne, je pense, de la DB. Ensuite, vous avez une chaîne, et vous pouvez vérifier les zéros ... Mais je pense que je n'ai pas compris quel est le problème, donc si vous me donnez plus de détails sur le problème, avec un exemple plus détaillé ... –

+0

les chaînes de la base de données et les affecter aux variables. Lorsque j'essaie d'exécuter des fonctions de chaîne sur eux, ils ne fonctionnent pas sur des nombres avec des zéros en tête (par exemple 00532), mais sur les nombres sans zéros en tête (c'est-à-dire 532) cela fonctionne bien. Lorsque j'utilise base_convert uniquement pour les nombres avec des zéros en tête, cela fonctionne correctement, mais les nombres sans zéros en tête sont convertis de manière incorrecte. Le problème est que je ne connais pas les numéros sur lesquels utiliser la fonction base_convert car je ne peux pas dire s'ils ont des zéros en tête sans les convertir en premier. Cela a-t-il du sens? Je n'avais même jamais entendu parler d'octales auparavant =/ – krx

0
$serial = 00032432; //here you have an octal number 
$serial= strval($serial); //now you have a string 
if ($serial[0]=="0") { 
//do something 
} 
+0

Cela ne fonctionne pas. J'ai ajouté un écho à l'instruction if et il n'apparaît pas. Les fonctions stratus et autres comme (string) ne fonctionnent pas non plus avec ces octals? Merci d'avoir aidé! – krx

+0

Ok, une autre question, comment obtenez-vous cette variable pour être un nombre? Le lancez-vous explicitement à (int) après l'avoir reçu de la base de données? Alors ne faites pas cela, car ce n'est pas un nombre, mais une chaîne! – naivists

1

Pour convertir un octal en une chaîne, le lancer:

$str = (string) 00032432; 

Vous pouvez convertir entre octal et décimal avec les fonctions octdec et decoct

<?php 
echo octdec('77') . "\n"; 
echo octdec(decoct(45)); 
?> 

http://uk.php.net/manual/en/function.octdec.php

+0

Je les avais essayés plus tôt. Les octals sont toujours représentés comme leurs équivalents et non comme des chaînes. c'est-à-dire - echo octdec (decoct (045)); montre comme 37 quand je voudrais qu'il montre comme 045 dans une chaîne. – krx

0

Tout de la base de données est automatiquement une chaîne. Les entiers sont des chaînes, les dates sont des chaînes, les chiens sont des chaînes.

Si vous faites quelque chose de bizarre, convertir quoi que ce soit à une chaîne par: $a = (string) 12;

+0

J'ai essayé aussi. Par exemple, lancez ceci: $ a = (string) 012; echo $ a; .... echos 10 pas 012. – krx

+0

@krio qui a du sens, car la valeur octale est convertie * avant * la conversion de chaîne. Cela ne devrait pas être le cas dans votre exemple, cependant. –

+0

Maintenant que je l'ai lu - je reçois la variable d'une base de données, mais elle est affectée à une valeur avant d'être utilisée. Il n'est pas directement inséré dans la requête. – krx

1
$str = sprintf('%o', $octal_value);