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

publicité (chargement)

Syndication

Réseaux sociaux