OVH Cloud OVH Cloud

separateur de millier

9 réponses
Avatar
Richard
Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??

1000000 => 1.000.000

merci


RM

9 réponses

Avatar
Frédéric Momméja
Richard écrivait le 26/01/06 17:24 :

Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??

1000000 => 1.000.000


Le séparateur de milliers français n'est pas le point mais l'espace. ;)

1000000 => 1 000 000

Quant à la manière de l'obtenir il y a ici des gens extrêmement plus
qualifiés que moi pour te répondre. :)

--
Frédéric Momméja

Avatar
R12y
Richard :
Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??


Bonjour.
Est-ce que le résultat servira encore à des calculs ou pas?

--
My Debian/apt repo:
My Fedora/yum Repo:

Avatar
Jonathan Barnoud
Richard écrivait le 26/01/06 17:24 :


Comment s'y prendre pour formater un nombre en chaine avec séparateur
de milliers français ??

1000000 => 1.000.000



Le séparateur de milliers français n'est pas le point mais l'espace. ;)

1000000 => 1 000 000

Quant à la manière de l'obtenir il y a ici des gens extrêmement plus
qualifiés que moi pour te répondre. :)

L'espace fine si on est pointilleux.


Jonathan Barnoud


Avatar
Paul M.
Richard wrote:

Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??

1000000 => 1.000.000

merci


RM


je ferais :

std::string sepMilliers(const std::string &nombre)
{
int decalage = (nombre.size() - 1) % 3 + 1; // Nombre de chiffres à garder au
// début : 1, 2 ou 3
std::string ret = nombre.substr(0, decalage); // On les garde

for(int i = 0; i < (nombre.size() - 1) / 3; ++ i) // Ensuite, pour c haque bloc
// (nombre.size() / 3 blocs)
{
if(!ret.empty()) // On ajoute l'espace s'il y a quelque chose à sé parer
ret += " ";
ret += nombre.substr(decalage + 3 * i, 3); // On recupere le bloc de trois
// chiffres
}

return ret;
}

madprog

Avatar
Paul M.
Frédéric Momméja wrote:
Richard écrivait le 26/01/06 17:24 :

Comment s'y prendre pour formater un nombre en chaine avec séparateu r
de milliers français ??

1000000 => 1.000.000


Le séparateur de milliers français n'est pas le point mais l'espace . ;)

1000000 => 1 000 000

Quant à la manière de l'obtenir il y a ici des gens extrêmement p lus
qualifiés que moi pour te répondre. :)



Je ferais :

def sepMilliers(nombre) :

decalage = (len(nombre) - 1) % 3 + 1 # Nombre de chiffres à garde r au début :
# 1, 2 ou 3

ret = nombre[0:decalage] # On les garde

for i in range(len(nombre) / 3) : # Ensuite, pour chaque bloc
# (il y a nombre.size() / 3 bloc s)

if len(ret) != 0 : ret += " " # On ajoute l'espace s'il y a quelque

# chose à séparer

# on recupere le bloc de trois c hiffres
ret += nombre[decalage + 3 * i: decalage + 3 * (i+1)]

return ret


madprog


Avatar
Amand Tihon
Frédéric Momméja wrote:

Richard écrivait le 26/01/06 17:24 :

Comment s'y prendre pour formater un nombre en chaine avec séparat eur de
milliers français ??

1000000 => 1.000.000


Le séparateur de milliers français n'est pas le point mais l'espa ce. ;)

1000000 => 1 000 000

Quant à la manière de l'obtenir il y a ici des gens extrêmement plus
qualifiés que moi pour te répondre. :)


Il y a sans doute plus court.
Il y a vraissemblablement plus optimisé.
Il y a très certainement plus lisible.
Néanmoins, voici une solution qui marche :

sepmil = lambda n: " ".join([n[::-1][3*i:3*i+3][::-1] for i in
range(len(n)/3+1)][::-1]).strip()

(sur une seule ligne, bien sûr).

py> sepmil("123456789012")
'123 456 789 012'
py> sepmil("1234567890123")
'1 234 567 890 123'

L'idée derrière tout ça, pour ceux qui auraient du mal à saisir toute la
beauté... euh... l'horreur de la chose, c'est de
- retourner la chaîne
- prendre les caractères par groupes de trois
- retourner chaque groupe
- retourner la liste des groupes
- réassembler le tout en séparant par des espaces.

Le strip() à la fin est là pour le cas où la chaîne de départ contient un
nombre de caractères multiple de 3.

Rho, j'ai (presque) honte :)

--
Amand Tihon


Avatar
jean-michel bain-cornu
Bonjour,
Richard wrote:

Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??

1000000 => 1.000.000
Ceux qui utilise habituelement WX peuvent prendre la classe NumCtrl

(voir un extrait de la doc ci-après).
Les autres aussi, comme ça ils auront une belle usine à gaz en plus sur
leur PC...
Cette classe qu'on utilise pour la saisie peut aussi être utilisée pour
le formattage, en sachant qu'il faut au moins une fenêtre wx, même si
elle n'est pas visible. De plus, ça ne marche pas avec ' ' comme
séparateur, il faut faire un replace après coup.
Dans le genre simple, c'est pas vraiment réussi, mais ça donne une
saisie formattée agréable pour l'utilisateur.
A+
jm

Extrait doc:
from wx.lib.masked import NumCtrl
NumCtrl(
parent, id = -1,
value = 0,
pos = wx.DefaultPosition,
size = wx.DefaultSize,
style = 0,
validator = wx.DefaultValidator,
name = "masked.number",
integerWidth = 10,
fractionWidth = 0,
allowNone = False,
allowNegative = True,
useParensForNegatives = False,
groupDigits = False,
groupChar = ',',
decimalChar = '.',
min = None,
max = None,
limited = False,
selectOnEntry = True,
foregroundColour = "Black",
signedForegroundColour = "Red",
emptyBackgroundColour = "White",
validBackgroundColour = "White",
invalidBackgroundColour = "Yellow",
autoSize = True
)

Avatar
Richard
Richard :
Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??


Bonjour.
Est-ce que le résultat servira encore à des calculs ou pas?

merci à tous pour vos réponses

en l'occurrence il s'agit juste d'afficher un prix dans une appli zope,
ce qui exclu WX

j'avais un peu honte de poser la question ici, parce que je pensai qu'il
existait une fonction pour ca, mais que je ne l'avais pas trouvé...
du coup je m'étonne qu'elle n'existe pas


RM


Avatar
JB
Comment s'y prendre pour formater un nombre en chaine avec séparateur de
milliers français ??
Le module locale ne fait pas l'affaire ?

Exemple :
locale.setlocale(locale.LC_ALL, 'English')
'English_United States.1252'



locale.format("%d",i,2)
'100,000'



locale.format("%d",123456789,2)
'123,456,789'



locale.setlocale(locale.LC_ALL, 'French')
'French_France.1252'



locale.format("%d",123456789,2)
'123xa0456xa0789'




la doc http://docs.python.org/lib/module-locale.html :)