#### Equip your Genius

Welcome to the Parallax Discussion Forums, sign-up to participate.

# Get individual characters from integer value

Posts: 97
Hello everyone. I feel like this should be simple, but I do not know how to do this in spin.

A value is being sent via a serial port in the following format: "B12345," (I'm using the Extended fullduplex serial so , is the delimiter.)

I am then taking everything after the first character and converting it to an integer. So the integer will equal 12345. I need to split this integer into 5 different variables equaling 1, 2, 3, 4, & 5. How do I go about this?

Here's my code:
```PUB readSerial | type, content, contentAdr, value, b

repeat

serial.rxflush

repeat until readBuffer <> "0"

type := readBuffer 'Take first character of string sent from computer to see type
content := readBuffer[1] 'Take everything after the first character to get content

if type == "A"
if content == "1"
winValue := 1
elseif content == "2"
winValue := 2

if type == "B"

value := 0                                                    ' reset value

repeat
b := byte[contentAdr++]                                           ' get digit from string
if ((b => "0") and (b =< "9"))                              ' if digit
value := value * 10 + (b - "0")                           '  update value
else
quit

testVar := value

if testVar == 12345
serial.str(string("matches/"))
else
serial.str(string("not a match/"))

update(@digit1, @digit2, @digit3, @digit4, @dp)
```

testVar is equaling 12345 so I know the conversion is working properly. I just need to get digit1, digit2, etc to equal 1, 2, 3, etc.

Thank you in advance.

• Posts: 589
edited 2018-12-17 - 12:03:41
You get a string like "31415", convert it by summing it digitwise times 10^n to an integer and then want to process individual digits?

Why not just subtract "0" (= 48) from all nonzero bytes in the string to get a string of 5 values of 0 to 9 and pass these bytes to your update function?
◁ propeller-wiki ▷ ◁ FastSpin ▷ ◁ Help Spin at RosettaCode.org ▷ ◁ No Source – No Go! ▷ ◁ DK-E ▷ ◁ :-D ▷ ◁ Stay OmmmmmmPtimistic! ▷ ◁ Why Asimov's Laws of Robotics Don't Work ▷ ◁ DNA is a four letter word. ▷ ◁ Stop slavery! Free all mitochondria! ▷
• Posts: 6,244
Here's a little method that will convert a decimal string to a value. You need to capture your input and then pass a pointer (the address of using @) to the first digit in the string to this method. It will return when it hits a non-digit in the string (any delimiter).
```pub dec_value(p_str) : value | c

repeat
c := byte[p_str++]
if ((c => "0") and (c =< "9"))
value *= 10
value += (c - "0")
else
quit
```
Jon McPhalen
Hollywood, CA
It's Jon or JonnyMac -- please do not call me Jonny.
• Posts: 136
begin loop
i=1
digit = string-48
value = 10*value + digit
loop until your at the last character of string[]

Particularly patient proactive practice positively predicates practically precise poly-processor Parallax Propeller programming paradigms.

.
• Posts: 2,211
Either you extract the digits from the received string:
```  testVar := value

digit1 := byte[contentAdr - 6] - "0"
digit2 := byte[contentAdr - 5] - "0"
digit3 := byte[contentAdr - 4] - "0"
digit4 := byte[contentAdr - 3] - "0"
digit5 := byte[contentAdr - 2] - "0"
```
or you calculate the digits from the decimal value, this is more universally usable:
```  testVar := value

digit1 := value / 10000 // 10
digit2 := value / 1000 // 10
digit3 := value / 100 // 10
digit4 := value / 10 // 10
digit5 := value / 1 // 10
```

Andy
• Posts: 97
Andy,

Thank you so much.. This worked great.