Quelles sont les lunettes de prescription non http://belgiquepharmacie.be/ Unie de liberté de santé oxford

Bash n’offre pas de fonction pour convertir une chaîne de caractères ou un nombre flottant en un entier.
Cela n’est toute fois pas impossible, il suffit de faire appel à printf1 et le tour est joué !

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env bash
# string_to_int.sh - Shell script to convert a string or float number
# to an integer.
 
function string_to_int ()
{
    LANG=C
    d=${1##*.}
    if [[ ${#1} -eq ${#d} ]]; then
        d=0
    fi
    e=${1%.*}
    e=${e//,/}
    printf %.0f "$e.$d" 2>/dev/null
}
 
not_int=("12.652" "-12.652" 12.652 14 "12,652" foo "1,254.8" 1,254.8 "125,160,254.8" "125,160,254")
 
for value in ${not_int[@]}; do
    echo "Convert $value to int: $(string_to_int $value)"
done

Ce qui nous donne :

$ ./string_to_int.sh 
Convert 12.652 to int: 13
Convert -12.652 to int: -13
Convert 12.652 to int: 13
Convert 14 to int: 14
Convert 12,652 to int: 12652
Convert foo to int: 0
Convert 1,254.8 to int: 1255
Convert 1,254.8 to int: 1255
Convert 125,160,254.8 to int: 125160255
Convert 125,160,254 to int: 125160254

Voir sur Github.

Mis à jour le 7 mars 2010
Prise en charge de la notation US. Merci à patpro.


Notes

  1. une substitution du séparateur des décimals . en , est nécessaire avant de faire appel à printf

publicité (chargement)

3 réponses pour Bash : convertir un string en entier

  1. patpro dit :

    hmmm. Ça marche parce que tu es en LANG=fr_FR, mais teste ton script comme ça :

    LANG=C ./string_to_int.sh

    Tu peux rendre ton script un peu plus générique en remplaçant ta fonction par :

    function string_to_int ()
    {
        LANG=C
        printf %.0f ${1/,/.}
    }

    Néanmoins, ça ne te sauvera pas en cas de nombres comme 1,254.8 (notation US pour 1254,8), car de toute manière, locale ou pas, ce cas n’est pas géré par printf.

  2. piouPiouM dit :

    Bien vu :-/
    J’ai pondu le code qui suit du coup, qu’en penses-tu ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    #!/usr/bin/env bash
    function string_to_int ()
    {
        LANG=C
        d=${1##*.} # partie décimale
        if [[ ${#1} -eq ${#d} ]]; then
            d=0
        fi
        e=${1%.*}  # partie entière
        e=${e//,/}
        printf %.0f "$e.$d" 2>/dev/null
    }
     
    not_int=("12.652" "-12.652" 12.652 14 "12,652" foo "1,254.8" 1,254.8 "125,160,254.8" "125,160,254")
     
    for value in ${not_int[@]}; do
        echo "Convert $value to int: $(string_to_int $value)"
    done

    Il impose du coup l’usage du point . en tant que séparateur des décimales et la virgule , comme séparateur dans la partie entière (non obligatoire).

  3. patpro dit :

    ça semble bien fonctionner :) Par contre j’ai pas le temps de voir si on peut faire plus simple. Plus tard sans doute !

Ajouter un commentaire


Syndication

Réseaux sociaux