Non-decimal radices/Convert: Difference between revisions

Content added Content deleted
(Add NetRexx implementation)
(added Caché ObjectScript)
Line 412: Line 412:
return result;
return result;
}</lang>
}</lang>

=={{header|Caché ObjectScript}}==

<lang cache>Class Utils.Convert [ Abstract ]
{

ClassMethod Base10ToN(pNum As %Integer = "", pBase As %Integer = "", pBaseStr As %String = "", pPos As %Integer = 0) As %String
{
If pNum=0 Quit ""
Set str=..Base10ToN(pNum\pBase, pBase, pBaseStr, pPos+1)
Quit str_$Extract(pBaseStr, pNum#pBase+1)
}

ClassMethod BaseNTo10(pStr As %String = "", pBase As %Integer = "", pBaseStr As %String = "", pPos As %Integer = 0) As %Integer
{
If pStr="" Quit 0
Set num=..BaseNTo10($Extract(pStr, 1, *-1), pBase, pBaseStr, pPos+1)
Set dec=$Find(pBaseStr, $Extract(pStr, *))-2
Quit num+(dec*(pBase**pPos))
}

ClassMethod Base(pStr As %String = "", pFrom As %Integer = 10, pTo As %Integer = 10, pBaseStr As %String = "", pLen As %Integer = 0) As %String
{
// some initialisation
If pBaseStr="" Set pBaseStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
// check input values
If pFrom=10 Set pStr=$Number(pStr, "i", 0) If pStr="" Quit ""
Set pFrom=$Number(pFrom, "i", 2, 94) If pFrom="" Quit ""
Set pTo=$Number(pTo, "i", 2, 94) If pTo="" Quit ""
Set pLen=$Number(pLen, "i", 0, 32) If pLen="" Quit ""
// does base number exceed base string?
If pFrom>$Length(pBaseStr) Quit ""
If pTo>$Length(pBaseStr) Quit ""
// allow for upper/lowercase values
If pTo=10 {
If $Match(pStr, "^[0-9a-z]+$"), $Match($Extract(pBaseStr, 1, pFrom), "^[0-9A-Z]+$") {
Set pStr=$ZConvert(pStr, "U")
}
If $Match(pStr, "^[0-9A-Z]+$"), $Match($Extract(pBaseStr, 1, pFrom), "^[0-9a-z]+$") {
Set pStr=$ZConvert(pStr, "L")
}
}
// do the conversion
If pFrom=pTo {
Set pStr=pStr
} ElseIf pFrom=10 {
Set pStr=..Base10ToN($Select(pStr=0: "", 1: pStr), pTo, pBaseStr)
} ElseIf pTo=10 {
Set pStr=..BaseNTo10(pStr, pFrom, pBaseStr)
} Else {
Set pStr=..Base10ToN(..BaseNTo10(pStr, pFrom, pBaseStr), pTo, pBaseStr)
}
// return value
If pLen=0 Quit pStr
If pTo'=10 Quit ..Pad(pStr, pLen, $Extract(pBaseStr))
Quit ..Pad(pStr, pLen)
}

ClassMethod Pad(pNum As %Integer, pLen As %Integer, pZero As %String = 0) As %String [ Private ]
{
If $Length(pNum)>pLen Quit pNum
Quit $Translate($Justify(pNum, pLen), " ", pZero)
}

}</lang>
{{out|Examples}}
<pre>USER>Write ##class(Utils.Convert).Base(1010101111001101, 2, 16)
ABCD

USER>Write $ZHex(26)
1A
USER>Write $ZHex("1A")
26

USER>Write ##class(Utils.Convert).Base(26, 10, 16)
1A
USER>Write ##class(Utils.Convert).Base("1A", 16, 10)
26

USER>Write ##class(Utils.Convert).Base(6234900123456700, 10, 42, "!$%-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_")
A9XUCDBHK6
USER>Write ##class(Utils.Convert).Base("A9XUCDBHK6", 42, 10, "!$%-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_")
6234900123456700</pre>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==