Non-decimal radices/Convert: Difference between revisions

m
Line 415:
=={{header|Caché ObjectScript}}==
 
<lang cache>Class Utils.ConvertNumber [ Abstract ]
{
 
ClassMethod Base10ToNConvertBase10ToN(pNum As %Integer = "", pBase As %Integer = "", pBaseStr As %String = "", pPos As %Integer = 0) As %String
{
If pNum=0 Quit ""
Set str=..Base10ToNConvertBase10ToN(pNum\pBase, pBase, pBaseStr, pPos+1)
Quit str_$Extract(pBaseStr, pNum#pBase+1)
}
 
ClassMethod BaseNTo10ConvertBaseNTo10(pStr As %String = "", pBase As %Integer = "", pBaseStr As %String = "", pPos As %Integer = 0) As %Integer
{
If pStr="" Quit 0
Set num=..BaseNTo10ConvertBaseNTo10($Extract(pStr, 1, *-1), pBase, pBaseStr, pPos+1)
Set dec=$Find(pBaseStr, $Extract(pStr, *))-2
Quit num+(dec*(pBase**pPos))
}
 
ClassMethod BaseConvertBase(pStr As %String = "", pFrom As %Integer = 10, pTo As %Integer = 10, pBaseStr As %String = "", pLen As %Integer = 0) As %String
{
// some initialisation
Line 462:
Set pStr=pStr
} ElseIf pFrom=10 {
Set pStr=..Base10ToNConvertBase10ToN($Select(pStr=0: "", 1: pStr), pTo, pBaseStr)
} ElseIf pTo=10 {
Set pStr=..BaseNTo10ConvertBaseNTo10(pStr, pFrom, pBaseStr)
} Else {
Set pStr=..Base10ToNConvertBase10ToN(..BaseNTo10ConvertBaseNTo10(pStr, pFrom, pBaseStr), pTo, pBaseStr)
}
// return value
If pLen=0 Quit pStr
If pTo'=10 Quit ..PadPadStr(pStr, pLen, $Extract(pBaseStr))
Quit ..PadPadStr(pStr, pLen)
}
 
ClassMethod PadPadStr(pNumpStr As %IntegerString, pLen As %Integer, pZero As %String = 0) As %String [ Private ]
{
If $Length(pNumpStr)>pLen Quit pNumpStr
Quit $Translate($Justify(pNumpStr, pLen), " ", pZero)
}
 
}</lang>
{{out|Examples}}
<pre>
<pre>USER>Write ##class(Utils.ConvertNumber).BaseConvertBase(1010101111001101, 2, 16)
ABCD
 
Line 491 ⟶ 492:
26
 
USER>Write ##class(Utils.ConvertNumber).BaseConvertBase(26, 10, 16)
1A
USER>Write ##class(Utils.ConvertNumber).BaseConvertBase("1A", 16, 10)
26
 
USER>Write ##class(Utils.ConvertNumber).BaseConvertBase(6234900123456700, 10, 42, "!$%-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_")
A9XUCDBHK6
USER>Write ##class(Utils.ConvertNumber).BaseConvertBase("A9XUCDBHK6", 42, 10, "!$%-0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_")
6234900123456700</pre>