String ( Zahl) Formatieren

Anfängerfragen zum Programmieren mit PureBasic.
elko68
Beiträge: 27
Registriert: 26.02.2010 14:50

Re: String ( Zahl) Formatieren

Beitrag von elko68 »

... nein, ich muss MID nehmen weil der String mit einem ";" endet.
Windows 7x64 Prof , PureBasic 5.20 LTS
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: String ( Zahl) Formatieren

Beitrag von Pelagio »

Es gibt noch eine andere Möglichkeit die eventuell für den Anfängerbereich zu fortgeschritten ist aber als mögliche Studie will ich es aufzeigen:

Code: Alles auswählen

Structure strucWert
   Vorsilbe.s{2}
   VorkommaZahl.s{8}
   NachkommaZahl.s{3}
EndStructure

Structure strucData
   StructureUnion
      VollString.s{13}
      TeilString.strucWert
   EndStructureUnion
EndStructure

Test.StrucData

Procedure.d Ergebnis(*vStruc.StrucData)

   ProcedureReturn ValD(*vStruc\TeilString\VorkommaZahl + "." + *vStruc\TeilString\nachkommaZahl)
EndProcedure

Test\VollString = "FA00001822420"
Debug Ergebnis(Test)

Test\VollString = "FA00144800000"
Debug Ergebnis(Test)
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Christian+
Beiträge: 213
Registriert: 13.07.2008 10:05
Computerausstattung: Windows 8.1 Pro
AMD Phenom II X4 955 @ 3.2 GHz
4GB RAM
NVIDIA GeForce GTX 660

Re: String ( Zahl) Formatieren

Beitrag von Christian+ »

@Pelagio
Sehr gute Lösung und gewiss schneller die Idee muss ich mir merken kann ich gewiss mal brauchen. :allright:
Du machst nun daraus aber Zahlen und keine Strings habe es mal an den Code von elko68 angepasst.

Code: Alles auswählen

Structure strucWert
   Vorsilbe.s{2}
   VorkommaZahl.s{8} 
   NachkommaZahl.s{3}
   Semikolon.s{1}
EndStructure

Structure strucData
   StructureUnion
      VollString.s{14}
      TeilString.strucWert
   EndStructureUnion
EndStructure

Test.StrucData

Procedure.s Ergebnis(*vStruc.StrucData)
  ProcedureReturn LTrim(*vStruc\TeilString\VorkommaZahl + "." + *vStruc\TeilString\nachkommaZahl+" KHz", "0")
EndProcedure

Test\VollString = "FA00001822420"
Debug Ergebnis(Test)

Test\VollString = "FA00144800000"
Debug Ergebnis(Test)
Zuletzt geändert von Christian+ am 01.03.2010 17:27, insgesamt 2-mal geändert.
Windows 8.1 Pro 64Bit | AMD Phenom II X4 955 @ 3.2 GHz | 4GB RAM | NVIDIA GeForce GTX 660
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: String ( Zahl) Formatieren

Beitrag von Josh »

Pelagio hat geschrieben:Es gibt noch eine andere Möglichkeit die eventuell für den Anfängerbereich zu fortgeschritten ist aber als mögliche Studie will ich es aufzeigen
ey, da kann man sich richtig auslassen bei den möglichkeiten :)
ist geschmackssache, aber ich würds eher mit einer structure machen. find es übersichtlicher

Code: Alles auswählen

EnableExplicit

Structure strucWert
   Vorsilbe.s{2}
   VorkommaZahl.s{8}
   NachkommaZahl.s{3}
EndStructure

Define Test.s

Procedure.d Ergebnis(*vStruc.strucWert)
  ProcedureReturn ValD(*vStruc\VorkommaZahl + "." + *vStruc\NachkommaZahl)
EndProcedure

Test = "FA00001822420"
Debug Ergebnis(@Test)

Test = "FA00144800000"
Debug Ergebnis(@Test)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: String ( Zahl) Formatieren

Beitrag von Kaeru Gaman »

elko68 hat geschrieben:... nein, ich muss MID nehmen weil der String mit einem ";" endet.
wie leiche man doch so ein semikolon übersieht.

@Pelagio
gute Idee.
mach den Vollstring mal 14 lang, du hast genau wie ich das ";" vergessen.

... und das bringt mich auf noch eine verrückte idee...
da der Platz für das Komma im String vorhanden ist, weil er mit einem Semikolon endet,
können wir auch die letzten drei Zeichen nach hinten schieben und das Komma einfügen.

Code: Alles auswählen

Procedure ChangeString( *Str2Change.String )
  PokeC( *Str2Change + 13* SizeOf(Character), PeekC(*Str2Change + 12* SizeOf(Character)))
  PokeC( *Str2Change + 12* SizeOf(Character), PeekC(*Str2Change + 11* SizeOf(Character)))
  PokeC( *Str2Change + 11* SizeOf(Character), PeekC(*Str2Change + 10* SizeOf(Character)))
  PokeC( *Str2Change + 10* SizeOf(Character), Asc(","))
  
  While PeekC( *Str2Change ) < Asc("1") Or PeekC( *Str2Change ) > Asc("9")
    PokeC( *Str2Change , Asc(" "))
    *Str2Change + SizeOf( Character )
  Wend
EndProcedure


a$ = "FA00144800000;"
b$ = "FA00024895000;"
c$ = "FA00001822420;"

ChangeString(@a$)
ChangeString(@b$)
ChangeString(@c$)

Debug a$
Debug b$
Debug c$
das ist eine Hardcore-Lösung, wie man sie vielleicht in den 70ern gewählt hätte, als noch jedes Byte kostbar war und auf einem Magnetband nur 18KB Platz hatten und jeder Datentransfer noch wirklich Rechenzeit gekostet hat...


wenn man heutzutage eine Methode sieht, die mit ungeprüftem, unbedingtem direkten Speicherzugriff arbeitet, hebt man sein Kreuz und flüstert "weiche!"....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
elko68
Beiträge: 27
Registriert: 26.02.2010 14:50

Re: String ( Zahl) Formatieren

Beitrag von elko68 »

:o ...wie mann eine Zeile funktionierenden (vieleicht auch nicht optimalen) Code so erweitern kann ist ja schon erstaunlich :mrgreen:
Windows 7x64 Prof , PureBasic 5.20 LTS
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: String ( Zahl) Formatieren

Beitrag von Josh »

elko68 hat geschrieben::o ...wie mann eine Zeile funktionierenden (vieleicht auch nicht optimalen) Code so erweitern kann ist ja schon erstaunlich :mrgreen:
lol, stimmt auch :D

aber was mir noch nie aufgefallen ist (habs wahrscheinlich auch noch nie gebraucht), purebasic setzt bei StrD/StrF unabhängig von der ländereinstellung einen punkt als komma. gibts da noch eine einstellung oder eine andere funktion, damit die ländereinstellung berücksichtigt wird?
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: String ( Zahl) Formatieren

Beitrag von mk-soft »

So mal auf die schnelle zusammenkopiert. Windows Only

Code: Alles auswählen

; Quelle http://support.microsoft.com/kb/221435
; Sprache	Gebietsschemabezeichner
; Afrikaans	1078 (&H436)
; Albanisch	1052 (&H41C)
; Arabisch	1025 (&H401)
; Arabisch (Algerien)	5121 (&H1401)
; Arabisch (Bahrain)	15361 (&H3C01)
; Arabisch (Ägypten)	3073 (&HC01)
; Arabisch (Irak)	2049 (&H801)
; Arabisch (Jordanien)	11265 (&H2C01)
; Arabisch (Kuwait)	13313 (&H3401)
; Arabisch (Libanon)	12289 (&H3001)
; Arabisch (Libyen)	4097 (&H1001)
; Arabisch (Marokko)	6145 (&H1801)
; Arabisch (Oman)	8193 (&H2001)
; Arabisch (Katar)	16385 (&H4001)
; Arabisch (Saudi-Arabien)	1025 (&H401)
; Arabisch (Syrien)	10241 (&H2801)
; Arabisch (Tunesien)	7169 (&H1C01)
; Arabisch (Vereinigte Arabische Emirate)	14337 (&H3801
; Arabisch (Jemen)	9217 (&H2401)
; Armenisch	1067 (&H42B)
; Assamisch	1101 (&H44D)
; Aserbaidschanisch (Kyrillisch)	2092 (&H82C)
; Azerbaidschanisch (Lateinisch)	1068 (&H42C)
; Baskisch	1069 (&H42D)
; Belgisch (Niederländisch)	2067 (&H813)
; Belgisch (Französisch)	2060 (&H80C)
; Bengali	1093 (&H445)
; Portugiesisch (Brasilien)	1046 (&H416)
; Bulgarisch	1026 (&H402)
; Birmanisch	1109 (&H455)
; Belarussisch (Weißrussland)	1059 (&H423)
; Katalanisch	1027 (&H403)
; Chinesisch (Hongkong S.A.R.)	3076 (&HC04)
; Chinesisch (Macao S.A.R.)	5124 (&H1404)
; Chinesisch (vereinfacht)	2052 (&H804)
; Chinesisch (Singapur)	4100 (&H1004)
; Chinesisch (traditionell)	1028 (&H404)
; Kroatisch	1050 (&H41A)
; Tschechisch	1029 (&H405)
; Dänisch	1030 (&H406)
; Niederländisch	1043 (&H413)
; Englisch (Australien)	3081 (&HC09)
; Englisch (Belize)	10249 (&H2809)
; Englisch (Kanada)	4105 (&H1009)
; Englisch (Karibik)	9225 (&H2409)
; Englisch (Irland)	6163 (&H1809)
; Englisch (Jamaika)	8201 (&H2009)
; Englisch (Neuseeland)	5129 (&H1409)
; Englisch (Philippinen)	13321 (&H3409)
; Englisch (Südafrika)	7177 (&H1C09)
; Englisch (Trinidad)	11273 (&H2C09)
; Englisch (Großbritannien)	2057 (&H809)
; Englisch (USA)	1033 (&H409)
; Englisch (Simbabwe)	12297 (&H3009)
; Estnisch	1061 (&H425)
; Färöisch	1080 (&H438)
; Farsi	1065 (&H429)
; Finnisch	1035 (&H40B)
; Französisch	1036 (&H40C)
; Französisch (Kamerun)	11276 (&H2C0C)
; Französisch (Kanada)	3084 (&HC0C)
; Französisch (Elfenbeinküste)	12300 (&H300C)
; Französisch (Luxemburg)	5132 (&H140C)
; Französisch (Mali)	13324 (&H340C)
; Französisch (Monaco)	6156 (&H180C)
; Französisch (Réunion)	8204 (&H200C)
; Französisch (Senegal)	10252 (&H280C)
; Französisch (Westindische Inseln)	7180 (&H1C0C)
; Französisch (Kongo, DRK)	9228 (&H240C)
; Friesisch (Niederlande)	1122 (&H462)
; Gälisch (Irland)	2108 (&H83C)
; Gälisch (Schottland)	1084 (&H43C)
; Galizisch	1110 (&H456)
; Georgisch	1079 (&H437)
; Deutsch	1031 (&H407)
; Deutsch (Österreich)	3079 (&HC07)
; Deutsch (Liechtenstein)	5127 (&H1407)
; Deutsch (Luxemburg)	4103 (&H1007)
; Griechisch	1032 (&H408)
; Gujarati	1095 (&H447)
; Hebräisch	1037 (&H40D)
; Hindi	1081 (&H439)
; Ungarisch	1038 (&H40E)
; Isländisch	1039 (&H40F)
; Indonesisch	1057 (&H421)
; Italienisch	1040 (&H410)
; Japanisch	1041 (&H411)
; Kanada	1099 (&H44B)
; Kashmiri	1120 (&H460)
; Kasachisch	1087 (&H43F)
; Khmer	1107 (&H453)
; Kirgisisch	1088 (&H440)
; Konkani	1111 (&H457)
; Koreanisch	1042 (&H412)
; Laotisch	1108 (&H454)
; Lettisch	1062 (&H426)
; Litauisch	1063 (&H427)
; FYROM (Mazedonisch)	1071 (&H42F)
; Malayalam	1100 (&H44C)
; Malaiisch (Brunei Darussalam)	2110 (&H83E)
; Malaiisch	1086 (&H43E)
; Maltesisch	1082 (&H43A)
; Manipuri	1112 (&H458)
; Marathi	1102 (&H44E)
; Mongolisch	1104 (&H450)
; Nepali	1121 (&H461)
; Norwegisch (Bokmål)	1044 (&H414)
; Norwegisch (Nynorsk)	2068 (&H814)
; Oriya	1096 (&H448)
; Polnisch	1045 (&H415)
; Portugiesisch	2070 (&H816)
; Punjabi	1094 (&H446)
; Rätoromanisch	1047 (&H417)
; Rumänisch	1048 (&H418)
; Rumänisch (Moldawien)	2072 (&H818)
; Russisch	1049 (&H419)
; Russisch (Moldavien)	2073 (&H819)
; Samisch (Lappisch)	1083 (&H43B)
; Sanskrit	1103 (&H44F)
; Serbisch (Kyrillisch)	3098 (&HC1A)
; Serbisch (Lateinisch)	2074 (&H81A)
; Sesothisch	1072 (&H430)
; Sindhi	1113 (&H459)
; Slowakisch	1051 (&H41B)
; Slowenisch	1060 (&H424)
; Sorbisch	1070 (&H42E)
; Spanisch (Traditionell)	1034 (&H40A)
; Spanisch (Argentinien)	11274 (&H2C0A)
; Spanisch (Bolivien)	16394 (&H400A)
; Spanisch (Chile)	13322 (&H340A)
; Spanisch (Kolumbien)	9226 (&H240A)
; Spanisch (Costa Rica)	5130 (&H140A)
; Spanisch (Dominikanische Republik)	7178 (&H1C0A)
; Spanisch (Ecuador)	12298 (&H300A)
; Spanisch (El Salvador)	17418 (&H440A)
; Spanisch (Guatemala)	4106 (&H100A)
; Spanisch (Honduras)	18442 (&H480A)
; Spanisch (Nicaragua)	19466 (&H4C0A)
; Spanisch (Panama)	6154 (&H180A)
; Spanisch (Paraguay)	15370 (H3C0A)
; Spanisch (Peru)	10250 (&H280A)
; Spanisch (Puerto Rico)	20490 (&H500A)
; Spanisch (Spanien-Modern)	3082 (&HC0A)
; Spanisch (Uruguay)	14346 (&H380A)
; Spanisch (Venezuela)	8202 (&H200A)
; Sutu	1072 (&H430)
; Suaheli	1089 (&H441)
; Schwedisch	1053 (&H41D)
; Schwedisch (Finnland)	2077 (&H81D)
; Französisch (Schweiz)	4108 (&H100C)
; Deutsch (Schweiz)	2055 (&H807)
; Italienisch (Schweiz)	2064 (&H810)
; Tadschikisch	1064 (&H428)
; Tamil	1097 (&H449)
; Tatarisch	1092 (&H444)
; Telugu	1098 (&H44A)
; Thailändisch	1054 (&H41E)
; Tibetanisch	1105 (&H451)
; Tsonga	1073 (&H431)
; Tswana	1074 (&H432)
; Türkisch	1055 (&H41F)
; Turkmenisch	1090 (&H442)
; Ukrainisch	1058 (&H422)
; Urdu	1056 (&H420)
; Usbekisch (Kyrillisch)	2115 (&H843)
; Usbekisch (Lateinisch)	1091 (&H443)
; Venda	1075 (&H433)
; Vietnamesisch	1066 (&H42A)
; Walisisch	1106 (&H452)
; Xhosa	1076 (&H434)
; Zulu	1077 (&H435)

Procedure.s MyValF(var.f, lcid = $0407)

  Protected hr.l, result.s, VarDest.Variant, varSource.Variant
  
  VarSource\vt = #VT_R4
  VarSource\fltVal = var
  hr = VariantChangeTypeEx_(VarDest, VarSource, lcid, 0, #VT_BSTR)
  If hr = #S_OK
    result = PeekS(VarDest\bstrVal, #PB_Any, #PB_Unicode)
  Else
    result = ""
  EndIf
  VariantClear_(VarDest)
  VariantClear_(VarSource)
  ProcedureReturn result
  
EndProcedure
 
Procedure.s MyValD(var.d, lcid = $0407)

  Protected hr.l, result.s, VarDest.Variant, varSource.Variant
  
  VarSource\vt = #VT_R8
  VarSource\dblVal = var
  hr = VariantChangeTypeEx_(VarDest, VarSource, lcid, 0, #VT_BSTR)
  If hr = #S_OK
    result = PeekS(VarDest\bstrVal, #PB_Any, #PB_Unicode)
  Else
    result = ""
  EndIf
  VariantClear_(VarDest)
  VariantClear_(VarSource)
  ProcedureReturn result
  
EndProcedure

MessageRequester("Result", MyValF(100.5))

MessageRequester("Result", MyVald(123456789.12, $0809))

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten