PHP implémente la méthode de conversion de chaîne sans utiliser de fonctions intégrées

小云云
Libérer: 2023-03-20 08:06:01
original
1493 Les gens l'ont consulté

Si nous voulons convertir des nombres de type chaîne PHP en nombres entiers, nous utilisons généralement l'API intégrée du système pour effectuer la conversion. Cependant, si la réglementation ne nous permet pas d'utiliser l'API intégrée du système pour convertir, nous devrons le faire nous-mêmes. Que dois-je faire pour implémenter une conversion de fonction ? Nous voyons ici comment y parvenir.

Méthode API intégrée au système

$num = '345432123';

 //(一)
$num = (int)$num;
//输出:
//int(345432123)

//(二)
$num = intval($num);
//输出:
//int(345432123)
Copier après la connexion

Utilisation de la méthode de code ASCII

Ci-dessous, nous utilisons la méthode de code ascii pour effectuer la conversion , car Chaque caractère correspond à un code ASCII. Lors de l'ajout, de la soustraction, de la multiplication et de la division de ce caractère, il s'agit en fait d'ajouter, de soustraire, de multiplier et de diviser le code ASCII, c'est-à-dire une opération entière, qui finira par renvoyer un entier. numéro.


-Images transférées depuis Internet-

Comme vous pouvez le voir sur l'image ci-dessus, les codes ASCII des caractères '0' ~ ' 9' sont 48~57, que nous utilisons lors de la conversion Soustrayez '0' de chaque caractère : Par exemple : '1' - '0' = 1, '2' - '0' = 2. La valeur de retour est de type Int. . Veuillez consulter l'implémentation du code ci-dessous.

function convertInt($strInt = ''){ 
 $len = strlen($strInt); 
 $int = 0;

 for($i=0;$i<$len;$i++){
  $int *= 10;   
  $num = $strInt{$i} - &#39;0&#39;;   
  $int += $num;  
 }

 return $int;  
}

 $num = &#39;345432123&#39;; 
 var_dump(convertInt($num)); //输出: int(345432123)
Copier après la connexion

Redis fournit également une fonction de conversion de chaînes en entiers, qui se fait également via le code ASCII. L'implémentation est relativement complète et rigoureuse. la

fonction string2ll

#include <stdio.h>
#include <limits.h>
#include <string.h>

/* Convert a string into a long long. Returns 1 if the string could be parsed
 * into a (non-overflowing) long long, 0 otherwise. The value will be set to
 * the parsed value when appropriate. */
int string2ll(const char *s, size_t slen, long long *value) {
 const char *p = s;
 size_t plen = 0;
 int negative = 0;
 unsigned long long v;

 if (plen == slen)
  return 0;

 /* Special case: first and only digit is 0. */
 if (slen == 1 && p[0] == '0') {
  if (value != NULL) *value = 0;
  return 1;
 }

 if (p[0] == '-') {
  negative = 1;
  p++; plen++;

  /* Abort on only a negative sign. */
  if (plen == slen)
   return 0;
 }

 /* First digit should be 1-9, otherwise the string should just be 0. */
 if (p[0] >= '1' && p[0] <= &#39;9&#39;) {
  v = p[0]-&#39;0&#39;;
  p++; plen++;
 } else if (p[0] == &#39;0&#39; && slen == 1) {
  *value = 0;
  return 1;
 } else {
  return 0;
 }

 while (plen < slen && p[0] >= '0' && p[0] <= &#39;9&#39;) {
  if (v > (ULLONG_MAX / 10)) /* Overflow. */
   return 0;
  v *= 10;

  if (v > (ULLONG_MAX - (p[0]-'0'))) /* Overflow. */
   return 0;
  v += p[0]-'0';

  p++; plen++;
 }

 /* Return if not all bytes were used. */
 if (plen < slen)
  return 0;

 if (negative) {
  if (v > ((unsigned long long)(-(LLONG_MIN+1))+1)) /* Overflow. */
   return 0;
  if (value != NULL) *value = -v;
 } else {
  if (v > LLONG_MAX) /* Overflow. */
   return 0;
  if (value != NULL) *value = v;
 }
 return 1;
}

//-------- 执行 ---------
int main(){
 long long num;
 string2ll("345432123",strlen("345432123"),&num);
 printf("%d\n",num); //输出 345432123
 retunr 0;
}
Copier après la connexion

Recommandations associées :

chaîne sql CONVERT() en type de caractère date entière

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal