From Swordfish Wiki

SwordfishUser: FloatToStrSE

FloatToStrSE module available for SwordFish SE.

This function is smaller, faster and work under SwordFish SE.

Public Sub FloatToStrSe(data_in as Float, byref data_str as string(18), digits as byte)
// Convert Float value to string, lenght of string is variable from 1 to 17.
// Ex. FloatToStrSE(-116.12345, data1, 0) , data1 will be "-116"
// Ex. FloatToStrSE(-116.12345, data1, 3) , data1 will be "-116.123"
// Ex. FloatToStrSE(-3.1, data1, 5) , data1 will be "-3.10000"

Example Code

Include "Float_conv"

Dim data_str As String(18)

FloatToStrSE(-3.1,data_str,5)

// data_str will be "-3.10000"

Module Code

{
*****************************************************************************
*  Name    : Float_conv.BAS                                                 *
*  Author  : Florin Andrei Medrea                                           *
*  Notice  : Copyright (c) 2007 - YO2LIO -                                  *
*          : All Rights Reserved                                            *
*  Date    : 10/20/2007                                                     *
*  Version : 1.0                                                            *
*  Notes   :                                                                *
*          :                                                                *
*****************************************************************************
}
Module Float_conv

Function StrLen(ByRef data_str As String) As Word
// returns the length, in bytes, of the string data_str
  FSR2 = @data_str
  ASM
    movf POSTINC2,w
    bnz $-1
    movf POSTDEC2,w
  End ASM
  result = FSR2 - @data_str
End Function

Sub StrCutChr(ByRef data_str As String, chr_ As Char)
// remove all specified chr from front of the string data_str
  FSR1 = @data_str
  While POSTINC1 = Byte(chr_) Wend
  FSR2 = @data_str 
  WREG = POSTDEC1 // decrement FSR1
  WREG = POSTDEC1 // decrement FSR1
  While POSTINC1 <> 0 POSTINC2 = INDF1 Wend
End Sub

Sub StrCat(ByRef data_str1, data_str2 As String)
// appends data_str2 to data_str1.
  FSR1 = @data_str1
  While POSTINC1 <> 0 Wend
  FSR2 = @data_str2
  WREG = POSTDEC1 // decrement FSR1
  WREG = POSTDEC2 // decrement FSR2
  While PREINC2 <> 0 POSTINC1 = INDF2 Wend
  INDF1 = 0
End Sub

Sub adjust_1()
  ASM
    movf INDF2,w
    andlw 0x0F
    addlw 0x30
    movwf POSTDEC1
    swapf POSTINC2,w
    andlw 0x0F
    addlw 0x30
    movwf POSTDEC1
  End ASM
End Sub

Sub LongWord2StrWithZeros(data_in As LongWord, ByRef data_str As String) // Microchip AN526
Dim loop_cnt, j, buf(9) As Byte
  buf(0) = data_in.Byte0
  buf(1) = data_in.Byte1
  buf(2) = data_in.Byte2
  buf(3) = data_in.Byte3
  buf(4) = 0
  buf(5) = 0
  buf(6) = 0
  buf(7) = 0
  buf(8) = 0
  loop_cnt = 0
  While loop_cnt < 32
    ASM
      rlcf buf+0,f
      rlcf buf+1,f
      rlcf buf+2,f
      rlcf buf+3,f
      rlcf buf+4,f
      rlcf buf+5,f
      rlcf buf+6,f
      rlcf buf+7,f
      rlcf buf+8,f
    End ASM
    If loop_cnt = 31 Then
      FSR1 = AddressOf(data_str) + 10
      FSR2 = AddressOf(buf) + 4
      ASM
        clrf POSTDEC1
      End ASM      
      adjust_1
      adjust_1
      adjust_1
      adjust_1
      adjust_1
      Exit
    End If
    FSR2 = AddressOf(buf) + 3
    j = 0
    While j < 5
      ASM
        movf POSTINC2,w
        movlw	0x03
        addwf	INDF2,w
        btfsc	WREG,3
        movwf	INDF2
        movlw	0x30
        addwf	INDF2,w
        btfsc	WREG,7
        movwf	INDF2
      End ASM
      Inc(j)
    Wend
    Inc(loop_cnt)
  Wend
End Sub

Sub Long2Str(data_in1 As LongInt, ByRef data_str3 As String)
Dim data_str6 As String(11),
    buf As LongWord,
    buf1 As Byte
  data_str3(0) = 0
  data_str3(1) = 0
  buf = LongWord(data_in1)
  buf1 = data_in1.Byte3
  If buf1.7 = 1 Then
    buf = Not(buf) + 1
    data_str3(0) = "-"
  End If
  LongWord2StrWithZeros(buf, data_str6)
  StrCutChr(data_str6, "0")
  If StrLen(data_str6) = 0 Then
    data_str6(0) = "0"
    data_str6(1) = 0
  End If
  StrCat(data_str3, data_str6)
End Sub

Public Sub FloatToStrSE(data_in4 As Float, ByRef data_str4 As String, digit As Byte)
Dim buf_f As LongInt,
    txt10 As String(11),
    SS_FSR1, SS_FSR2 As Word
  SS_FSR1 = FSR1
  SS_FSR2 = FSR2
  buf_f = LongInt(data_in4)
  Long2Str(buf_f, data_str4)
  If digit = 0 Then GoTo loop_p End If
  data_in4 = data_in4 - Float(buf_f)
  If data_in4 < 0.0 Then data_in4 = data_in4 * -100000.0
  Else data_in4 = data_in4 * 100000.0 End If
  data_in4 = data_in4 + 0.9
  LongWord2StrWithZeros(LongInt(data_in4), txt10)
  FSR1 = AddressOf(data_str4)
  FSR2 = AddressOf(txt10) + 5
  While POSTINC1 <> 0 Wend
  WREG = POSTDEC1
  POSTINC1 = "."
  If digit > 5 Then digit = 5 End If
  While digit > 0 
    POSTINC1 = POSTINC2
    Dec(digit)
  Wend
  INDF1 = 0
loop_p:
  FSR1 = SS_FSR1
  FSR2 = SS_FSR2 
End Sub
Retrieved from http://www.sfcompiler.co.uk/wiki/pmwiki.php?n=SwordfishUser.FloatToStrSE
Page last modified on October 21, 2007, at 07:31 AM