Base 70 to Decimal

ShadowInTheD

Active Member
Reaction score
12
JASS:
function Base70ToDecimal takes player pl, string s returns integer
  local string Alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^&*?"
  local string Base70String = s
  local string output = ""
  local integer loopinteger = StringLength(s)
  local integer IntegerTracker = 0
  local integer Alphabet_Checker
  local integer Letter_Number
    loop
      exitwhen loopinteger < 0
      loop
        set Alphabet_Checker = 0
          if SubString(s,loopinteger,loopinteger+1) == SubString(Alphabet,Alphabet_Checker,Alphabet_Checker+1) then
            set Letter_Number = Alphabet_Checker
            exitwhen true
          endif
      endloop
      set IntegerTracker = IntegerTracker + (R2I(Pow(70,loopinteger))*Letter_Number)
    endloop
    call DisplayTimedTextToPlayer(pl,0,0,60,I2S(IntegerTracker))
    return IntegerTracker
endfunction


is supposed to convert a base 70 string into decimal, now the only problem I've encountered now is that it's not displaying... anything.. Also, is there any mistakes which would cause this not to work?
 

lovexylitol

New Member
Reaction score
2
On first glance

I didnt really dig into the code, but it looks like both loops do not have any increment code

JASS:
set loopinteger = loopinteger + 1
set Alphabet_Checker = Alphabet_Checker + 1


And if Alphabet_Checker is a index, you should initialize it before the loop starts.

And one more thing. You only need to do SubString(s,loopinteger,loopinteger+1) once for every iteration of the outer loop, while your code does it for every iteration of the inner loop.
 

ShadowInTheD

Active Member
Reaction score
12
It's not working.
1 -> 71
2 -> 71
3 -> 71
10 -> 4900
100 -> 343000
101 -> 343070
110 -> 343001

It seems like the tens place and the ones place got switched, but how could that happen......

JASS:
function Base70ToDecimal takes player pl, string s returns integer
  local string Alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^&*?"
  local string Base70String = s
  local string output = ""
  local integer loopinteger = StringLength(s)
  local integer IntegerTracker = 0
  local integer Alphabet_Checker
  local integer Letter_Number
    loop
      exitwhen loopinteger < 0
      set Alphabet_Checker = 0
      loop
          if SubString(s,loopinteger,loopinteger+1) == SubString(Alphabet,Alphabet_Checker,Alphabet_Checker+1) then
            set Letter_Number = Alphabet_Checker
            exitwhen true
          endif
          set Alphabet_Checker = Alphabet_Checker+1
      endloop
      set IntegerTracker = IntegerTracker + (R2I(Pow(70,loopinteger))*Letter_Number)
      set loopinteger = loopinteger - 1
    endloop
    call DisplayTimedTextToPlayer(pl,0,0,60,"Decimal: " + I2S(IntegerTracker))
    return IntegerTracker
endfunction
 

Vexorian

Why no custom sig?
Reaction score
187
exitwhen loopinteger < 0

gives the impression you are doing 0-indexes, however, your first value is StringLength(s) which suggests 1-indexing.

subString is 0-indexing so...
maybe you should move loopinteger ⁼ loopinteger -1 to above the exitwhen part-
 

ShadowInTheD

Active Member
Reaction score
12
I don't think that helped at all, as I fixed it taking into account for that, kinda..

JASS:
function Base70ToDecimal takes player pl, string s returns integer
  local string Alphabet = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^&amp;*?&quot;
  local string Base70String = s
  local string output = &quot;&quot;
  local integer loopinteger = StringLength(s)
  local integer IntegerTracker = 0
  local integer Alphabet_Checker
  local integer Letter_Number
    loop
      set loopinteger = loopinteger - 1
      exitwhen loopinteger &lt; 0
      set Alphabet_Checker = 0
      loop
          if SubString(s,loopinteger,loopinteger+1) == SubString(Alphabet,Alphabet_Checker,Alphabet_Checker+1) then
            set Letter_Number = Alphabet_Checker
            exitwhen true
          endif
          set Alphabet_Checker = Alphabet_Checker+1
      endloop
      set IntegerTracker = IntegerTracker + (R2I(Pow(70,loopinteger-1))*Letter_Number)
      set loopinteger = loopinteger - 1
    endloop
    call DisplayTimedTextToPlayer(pl,0,0,60,&quot;Decimal: &quot; + I2S(IntegerTracker))
    return IntegerTracker
endfunction


Is the code. There's something not right with the Letter Checking loop or something.

EDIT: Also, if I like test it, it cuts it off at 1. It might be fixed if I can fix it from being cut off, what would cause it? example "- 5" returns 5, "- 55" doesn't return anything.
 

ShadowInTheD

Active Member
Reaction score
12
Save/Load Code

This is my code to get an input value


For some reason, if I do like "5 it goes fine, but if I do like "55" it just doesn't work, did I do something wrong?

JASS:
function Base70ToDecimal takes player pl, string s returns integer
  local string Alphabet = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^&amp;*?&quot;
  local string Base70String = s
  local string output = &quot;&quot;
  local integer loopinteger = StringLength(s)
  local integer IntegerTracker = 0
  local integer Alphabet_Checker
  local integer Letter_Number
  local integer Digit_counter = 0
    loop
      set loopinteger = loopinteger - 1
      exitwhen loopinteger &lt; 0
      set Alphabet_Checker = 0
      set Digit_counter = Digit_counter + 1
      loop
          if SubString(s,Digit_counter,Digit_counter+1) == SubString(Alphabet,Alphabet_Checker,Alphabet_Checker+1) then
            set Letter_Number = Alphabet_Checker
            exitwhen true
          endif
          set Alphabet_Checker = Alphabet_Checker+1
      endloop
      set IntegerTracker = IntegerTracker + (R2I(Pow(70,loopinteger-1))*Letter_Number)
      set loopinteger = loopinteger - 1
    endloop
    call DisplayTimedTextToPlayer(pl,0,0,60,&quot;Decimal: &quot; + I2S(IntegerTracker))
    return IntegerTracker
endfunction
 

ShadowInTheD

Active Member
Reaction score
12
BUMP?

I fixed it:

JASS:
function Base70ToDecimal takes string s returns integer
  local string Alphabet = &quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$^&amp;*?&quot;
  local string Base70String = s
  local string output = &quot;&quot;
  local integer loopinteger = StringLength(s)+1
  local integer IntegerTracker = 0
  local integer Alphabet_Checker
  local integer Letter_Number
  local integer Digit_counter = -1
    loop
    set loopinteger = loopinteger - 1
      exitwhen loopinteger &lt; 0
      set Alphabet_Checker = 0
      set Digit_counter = Digit_counter + 1
      loop
          if SubString(s,Digit_counter,Digit_counter+1) == SubString(Alphabet,Alphabet_Checker,Alphabet_Checker+1) then
            set Letter_Number = Alphabet_Checker
            exitwhen true
          endif
          set Alphabet_Checker = Alphabet_Checker+1
      endloop
      set IntegerTracker = IntegerTracker + (R2I(Pow(70,loopinteger-1))*Letter_Number)
    endloop
    return IntegerTracker
endfunction


is the function if anyone wants / needs it.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top