AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Zahl in einzelne Stellen zerlegen ohne Stringkonvertierung!

Zahl in einzelne Stellen zerlegen ohne Stringkonvertierung!

Offene Frage von "richard_boderich"
Ein Thema von richard_boderich · begonnen am 26. Apr 2009 · letzter Beitrag vom 26. Apr 2009
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#1

Zahl in einzelne Stellen zerlegen ohne Stringkonvertierung!

  Alt 26. Apr 2009, 00:34
Hallo zusammen!

Ich hätte da mal eine Frage an die Runde. Ich habe eine 3- stellige Zahl sagen wir mal die z.B. die "123".
Ich möchte diese Zahl jetzt gerne zerlegen. und zwar in ihre 1-ner , 10-ner und 100-ter Stelle. Undzwar wenn möglich
elegant und ohne Stringconvertierung (und Zerlegung in einzelne Chars).

Also so...

123 = 1 100'er Stelle
= 2 10' Stelle
= 3 1' Stelle

Das kann man ja auch so ausdrücken

-> 1*10^2 + 2*10^1 + 3*10^0

so kann man die Zahl erzeugen, aber ich habe grad gar keine Idee wie man zurückrechnen könnte.
Hat da jemand eine Idee?
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 01:18
Mal nicht direkt in Delphi, sonder eher funktional. Aber das Prinzip sollte klar werden
Code:
function toDigits (0) = []
function toDigits (number) = concat(toDigits (number / 10), listOf(number mod 10))
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 09:46
Spontan fallen mir da auch 2 Möglichkeiten ein:
Delphi-Quellcode:
function Stellenwert(Zahl: integer; Stelle: byte): integer;
begin
  Result := trunc(Zahl / Power(10,Pred(Stelle))) mod 10;
  //oder
  Result := trunc(frac(Zahl / Power(10,Stelle)) * 10);
end;
Stelle ist dann "von rechts" anzugeben, also 1 für die 1er-Stelle, 2 für die 10er-Stelle usw.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 10:25
Und sukkzessives Zerteilen geht so:
Delphi-Quellcode:
Function NumberToDigits (aNumber : Cardinal) : TByteArray;
Var
  n : Integer;

Begin
  n := 0;
  SetLength (Result, 10);
  While aNumber <> 0 do Begin
    Result[n] := aNumber mod 10;
    aNumber := aNumber div 10;
    Inc (n);
  End;
  SetLength (Result, n + 1);
End;
..
// Beispiel
Var
  B : TByteArray;

Begin
  B := NumberToDigits (1234); // --> B = (4,3,2,1), also B[0] = 4, B[1] = 3 usw
Dann hast Du in einem Abwasch gleich die ganze Zahl unterteilt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 10:29
Angeber . Aber dann würde ich das Array zumindest als Parameter übergeben, um dem Grundsatz genüge zu tun, dass man Speicher auf der Ebene freigeben soll, auf der er angefordert wurde.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#6

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 11:01
jetzt könnte man noch auf ASM umsteigen (IDIV = DIV + MOD zugleich)

PS: wegen des Speichers ... da kümmert sich Delphi drum, also isses "egal", da du dich nicht ums Freigeben kümmern mußt
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 11:54
Zitat von alzaimar:
Und sukkzessives Zerteilen geht so:
Delphi-Quellcode:
Function NumberToDigits (aNumber : Cardinal) : TByteArray;
Var
  n : Integer;

Begin
  n := 0;
  SetLength (Result, 10);
  While aNumber <> 0 do Begin
    Result[n] := aNumber mod 10;
    aNumber := aNumber div 10;
    Inc (n);
  End;
  SetLength (Result, n + 1);
End;
..
// Beispiel
Var
  B : TByteArray;

Begin
  B := NumberToDigits (1234); // --> B = (4,3,2,1), also B[0] = 4, B[1] = 3 usw
Dann hast Du in einem Abwasch gleich die ganze Zahl unterteilt.

@alzaimar:
In der letzten Zeile von NumberToDigits sollte es wohl besser heißen
SetLength (Result, n);
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#8

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 12:11
@alzaimar

Leider bekomme ich unter Delphi 7 die Fehlermeldung inkompatible Typen bei den Setlength Zuweisungen?!
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#9

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 12:23
nimm mal statt TByteArray ein TByteDynArray


[add]
Delphi-Quellcode:
Uses Types; // für TByteDynArray

Function NumberToDigits(Number: Cardinal): TByteDynArray;
  Var n: Integer;

  Begin
    SetLength(Result, 10);
    n := 0;
    ASM
      PUSH EDI
      MOV EDI, &Result
      MOV EDI, [EDI]
      MOV ECX, 10
      MOV EAX, &Number
      @@Loop:
      XOR EDX, EDX
      IDIV ECX
      MOV [EDI], DL
      INC EDI
      INC &n
      TEST EAX, EAX
      JNZ @@Loop
      POP EDI
    End;
    SetLength(Result, n);
  End;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von richard_boderich
richard_boderich

Registriert seit: 21. Jun 2004
Ort: Berlin
1.067 Beiträge
 
Delphi 7 Architect
 
#10

Re: Zahl in einzelne Stellen zerlegen ohne Stringkonvertieru

  Alt 26. Apr 2009, 13:10
besten Dank himi! Es funktionopelt prächtig
mfG Richard

Cimmams schrieb "das einzige was an ArmA gut ist, ist die Grafik bis 100m und der Rest ist so unreal wie unsere Demokratie."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz