[C#] Decimal.Parse

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Goede nacht heren,

Ik ben nu al zeker 40 minuten aan het zoeken naar een manier om een string input , bijvoorbeeld 340.0 te parsen naar een decimal, nu is dat opzich geen probleem, ik krijg alleen continue 340,0 terug ipv 340.0 ( dus een komma ipv een punt ). Ik heb alle mogelijke CultureInfo's gebruikt en NumberStyles. maar het lukt mij gewoon niet om dit te parsen zoals ik wil.

Iemand die mij kan helpen ?

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

string.Replace? :+

Ik krijg 340.0 terug, maar mijn laptop staat compleet op US ingesteld.

Waarom wil je . ipv , ?

Ik ga even naar de winkel en dan zoek ik verder.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
dat zit ik hier ook.

degene voor wie het programma is wil et zo hebben

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

C#:
1
2
            System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator = ",";
            System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSeparator = ".";


Als je hier eens mee speelt?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Snake schreef op vrijdag 01 mei 2009 @ 06:06:
C#:
1
2
            System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator = ",";
            System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSeparator = ".";


Als je hier eens mee speelt?
nope maar : krijg er gelijk een exception op: {"Instance is read-only."}

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 20:09
Doe je het anders, bekijk je eerst met System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator wat de separator is. Is het een punt ga je verder met parsen, is het een komma vervang je alle punten door komma's en alle komma's door punten (in het geval er ook duizendtal-tekens in kunnen staan) en ga je dan pas parsen.

Acties:
  • 0 Henk 'm!

  • Spiral
  • Registratie: December 2005
  • Niet online
Als je de gehele applicatie in bv Nederlandse culture wilt hebben standaard. Dan zet je het volgende in bv. de main()

C#:
1
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");


of

C#:
1
2
CultureInfo ci = new CultureInfo("en-US");
String sValue = Decimal.Parse(130.4).ToString(ci);


Even een compleet voorbeeldje:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.Globalization;

public class Test
{

public static void Main()
{
    //Hiermee geef je aan welke input gebruikt wordt.
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    //Geef aan in welke culture het wilt hebben
    CultureInfo ci = new CultureInfo("en-US");
    //Geef de waarde op hoe de user deze ingeeft. En zet deze om naar de gewenste culture.
    string sValue = decimal.Parse("130.4").ToString(ci);
    System.Console.WriteLine(sValue);
        
    //OF
    //Hiermee geef je aan welke input gebruikt wordt.
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    //Geef de waarde op hoe de user deze ingeeft.
    sValue = decimal.Parse("130.4").ToString();
    System.Console.WriteLine(sValue);

}

}

[ Voor 56% gewijzigd door Spiral op 01-05-2009 09:13 . Reden: nl-NL naar en-US en een compleet voorbeeld ]

To say of what is that it is not, or of what is not that it is, is false, while to say of what is that it is, and of what is not that it is not, is true. | Aristoteles


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 03:14

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Representatie en opslag
Decimaal teken en cijfergroeperingssymbool

[ Voor 40% gewijzigd door RobIII op 01-05-2009 11:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 14-05 11:43
Invisible_man schreef op vrijdag 01 mei 2009 @ 07:16:
Doe je het anders, bekijk je eerst met System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator wat de separator is. Is het een punt ga je verder met parsen, is het een komma vervang je alle punten door komma's en alle komma's door punten (in het geval er ook duizendtal-tekens in kunnen staan) en ga je dan pas parsen.
Of anders gebruik je de cultureinfo zoals die bedoeld is, en geef je de cultureinfo mee aan de parse / format methoden?

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Ik heb dat nu allemaal geprobeerd, maar geen success.
Ik krijg of : 340,4 als output of 3404 of 340 maar geen 340.4

Mijn landinstellingen staan op : "Standards and formats" = Dutch, "location" = Netherlands en toestenbord instellingen staan op English->US

en bij Regional settings van standards and formats staat idd decimal symbol op ,

Maar ik wil niet dat het programma op een andere bak dan anders gedraagt als op mn dev bak, dus het moet in het programma worden ingebakken dat de output goed is. btw dit moet geen string zijn als output maar echt een decimal ( er moet nog mee gerekent worden )

hmm, had nog een ding geprobeerd :
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );
Console.WriteLine( "Size: " + decimal.Parse( s ) );
Dat werkt nu wel, maar lijkt me raar dat wanneer ik de cultureinfo aan de parse method meegeef hij het niet pakt :/

[ Voor 20% gewijzigd door Sc0tTy op 01-05-2009 15:11 ]

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Volgens mij haal je de concepten interne representatie en presentatie door de war.
Je moet de input parsen zoals de instellingen van de gebruiker staan. Je doet vervolgens waarschijnlijk een output via de Console.WriteLine, of een toekenning aan een form-field. In beide gevallen zal door .Net de decimal worden omgezet naar een string (middels de standaard ToString() methode). Deze ToString gebruikt de standaard Culture settings, in jouw geval de nederlandse. Works as designed dus.

Laat voor de vorm eens wat relevante code zien, zodat wij beter begrijpen waar je mee bezig bent.

Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Programma moet gewichten bij houden van producten en daarna dus bijv het uiteindelijke gewicht berekenen van een order.

Het uitput parsen naar de cmdline is alleen om te testen als ik met een break point ff kijk, is nu de waarde van de variabele nu ook 340.4 en dat is de bedoeling, het moet zo in het database komen

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Als jouw database de waarde ook opslaat als decimal, dan zou je geen problemen hoeven te verwachten mits je bij het uitvoeren van inserts en updates gebruik maakt van een stored procedure of een parameterized query.
Stel je de query volledig als string samen, dan heb je natuurlijk wel te maken met de regionale instellingen van zowel je clients (ik ga uit van een winform app) als je databaseserver.

Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
bigbeng schreef op vrijdag 01 mei 2009 @ 16:27:
Als jouw database de waarde ook opslaat als decimal, dan zou je geen problemen hoeven te verwachten mits je bij het uitvoeren van inserts en updates gebruik maakt van een stored procedure of een parameterized query.
Stel je de query volledig als string samen, dan heb je natuurlijk wel te maken met de regionale instellingen van zowel je clients (ik ga uit van een winform app) als je databaseserver.
mysql bak, hangt ook nog een website aan. in het database schrijft hij et wel goed weg,

ik gebruik nu telkens voordat ik een parse doe die System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );
beetje raar dat hij et niet mee pakt als je em meegeeft in de parse method, maar goed het werkt, en wil eigenlijk verder :P

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:08

Janoz

Moderator Devschuur®

!litemod

Bij de parse methode gaat het over van string naar float. Volgens mij heeft BigBang behoorlijk gelijk wanneer hij zegt "Volgens mij haal je de concepten interne representatie en presentatie door de war.".

Het megeven van de culture info bij de parse is ALLEEN van belang voor de INPUT. Daarna is het een object van het type float. Daarin zit helemaal geen komma of punt of wat dan ook. Pas wanneer je het weer af gaat drukken (bijvoorbeeld met Console.WriteLine) wordt de toString (oid) van de float aangeroepen en hier wordt vervolgens weer naar de culture info gekeken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16:53
bigbeng schreef op vrijdag 01 mei 2009 @ 15:15:
Je moet de input parsen zoals de instellingen van de gebruiker staan.
Volgens mij ga je dan de boot in als je een file parsed die op een systeem met andere instellingen is gegenereerd?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • Phyxion
  • Registratie: April 2004
  • Niet online

Phyxion

_/-\o_

Sc0tTy schreef op vrijdag 01 mei 2009 @ 15:07:
Ik heb dat nu allemaal geprobeerd, maar geen success.
Ik krijg of : 340,4 als output of 3404 of 340 maar geen 340.4

Mijn landinstellingen staan op : "Standards and formats" = Dutch, "location" = Netherlands en toestenbord instellingen staan op English->US

en bij Regional settings van standards and formats staat idd decimal symbol op ,

Maar ik wil niet dat het programma op een andere bak dan anders gedraagt als op mn dev bak, dus het moet in het programma worden ingebakken dat de output goed is. btw dit moet geen string zijn als output maar echt een decimal ( er moet nog mee gerekent worden )

hmm, had nog een ding geprobeerd :

[...]

Dat werkt nu wel, maar lijkt me raar dat wanneer ik de cultureinfo aan de parse method meegeef hij het niet pakt :/
Dit moet echt werken hoor:
C#:
1
2
3
4
5
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;

string decimalString = Decimal.Parse("340.4").ToString();
Console.WriteLine(decimalString);           //Outputs 340.4 according to CultureInfo.

Ik gebruik dit zelf ook en het werkt perfect op zowel Windows NL als Windows UK (En dus ook andere talen).

'You like a gay cowboy and you look like a gay terrorist.' - James May


Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Phyxion schreef op zaterdag 02 mei 2009 @ 08:31:
[...]

Dit moet echt werken hoor:
C#:
1
2
3
4
5
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;

string decimalString = Decimal.Parse("340.4").ToString();
Console.WriteLine(decimalString);           //Outputs 340.4 according to CultureInfo.

Ik gebruik dit zelf ook en het werkt perfect op zowel Windows NL als Windows UK (En dus ook andere talen).
Ik doe dat nu ook en werkt ook :) Jammer genoeg als jeje thread dus opnieuw start moet je het opnieuw doen ( oftewel kan in mn main niet zetten dat dat moet gebeuren, maar op elke plaats waar ik het wil ), geen probleem, alleen hoe minder werk hoe beter ^^

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 07-05 20:56
Sc0tTy schreef op zaterdag 02 mei 2009 @ 14:54:
[...]


Ik doe dat nu ook en werkt ook :) Jammer genoeg als jeje thread dus opnieuw start moet je het opnieuw doen ( oftewel kan in mn main niet zetten dat dat moet gebeuren, maar op elke plaats waar ik het wil ), geen probleem, alleen hoe minder werk hoe beter ^^
Je moet er gewoon voor zorgen dat getallen die je weggeschreven hebt naar een file, database, xml, etc. weggeschreven zijn met een consistente culture. Aangezien files etc. over het algemeen portable moeten zijn is het het beste om deze culture-invariant op te slaan en terug te lezen. Maw:

C#:
1
2
3
4
5
6
7
8
9
10
decimal myDecimal = 304.4;

// Culture-invariant representatie maken voor opslag.
string myStoredString = myDecimal.ToString(CultureInfo.InvariantCulture);

// Culture-invariant representatie terug in lezen
myDecimal = decimal.Parse(myStoredString, CultureInfo.InvariantCulture);

// String maken voor weergave in de applicatie, mbv ingestelde culture v/d gebruiker
string myDisplayedString = myDecimal.ToString();


Als dit niet werkt is er iets heel erg mis met je applicatie.

En zoals eerder al gezegd: een waarde naar de console dumpen is hier niet de correcte manier om te kijken of je een decimal correct geparsed hebt. Deze zal nl. al een ToString() met de standaard culture v/d thread aanroepen wat je beeld van de daadwerkelijke waarde kan gaan vertekenen. Wil je de interne waarde van de decimal controleren, dan zet je een breakpoint en inspecteer je de waarde met je debugger.

Acties:
  • 0 Henk 'm!

  • Sc0tTy
  • Registratie: December 2003
  • Laatst online: 18-04 08:29
Sc0tTy schreef op vrijdag 01 mei 2009 @ 15:29:
Het uitput parsen naar de cmdline is alleen om te testen als ik met een break point ff kijk, is nu de waarde van de variabele nu ook 340.4 en dat is de bedoeling, het moet zo in het database komen
Wel lezen hea ;) Maar van mij mag het topic op slot

Lumia 800 > 820 > 950 | Surface Pro 3 | Windows 10 Mobile Insider


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:08

Janoz

Moderator Devschuur®

!litemod

Sc0tTy schreef op zaterdag 02 mei 2009 @ 20:09:
[...]


Wel lezen hea ;) Maar van mij mag het topic op slot
Topics gaan alleen op slot wanneer ze niet aan de policies voldoen.

Verder geeft het stukje wat je quote alleen maar aan dat je het niet begrepen hebt. Een float heeft helemaal geen komma of punt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • - peter -
  • Registratie: September 2002
  • Laatst online: 13-05 08:39
Een mooie manier om je culture info op invariant te zetten is:
code:
1
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
Pagina: 1