https://bz.apache.org/ooo/show_bug.cgi?id=128533
[email protected] changed: What |Removed |Added ---------------------------------------------------------------------------- Latest|--- |4.2.0-dev Confirmation in| | Hardware|PC |All CC| |[email protected] OS|Windows, all |All --- Comment #1 from [email protected] --- Our StarBasic implementation is in main/basic. In there, built-in functions like Str() are declared with the form RTLFUNC(Str), and be found with: $ grep RTLFUNC\(Str * -R which gives, among others: runtime/methods.cxx:RTLFUNC(Str) where we see what it does: ---snip--- 1573 RTLFUNC(Str) 1574 { 1575 (void)pBasic; 1576 (void)bWrite; 1577 1578 if ( rPar.Count() < 2 ) 1579 StarBASIC::Error( SbERR_BAD_ARGUMENT ); 1580 else 1581 { 1582 String aStr; 1583 SbxVariableRef pArg = rPar.Get( 1 ); 1584 pArg->Format( aStr ); 1585 1586 // Numbers start with a space 1587 if( pArg->IsNumericRTL() ) 1588 { 1589 // Kommas durch Punkte ersetzen, damit es symmetrisch zu Val ist! 1590 aStr.SearchAndReplace( ',', '.' ); 1591 1592 SbiInstance* pInst = pINST; 1593 bool bCompatibility = ( pInst && pInst->IsCompatibility() ); 1594 if( bCompatibility ) 1595 { 1596 xub_StrLen nLen = aStr.Len(); 1597 1598 const sal_Unicode* pBuf = aStr.GetBuffer(); 1599 1600 bool bNeg = ( pBuf[0] == '-' ); 1601 sal_uInt16 iZeroSearch = 0; 1602 if( bNeg ) 1603 iZeroSearch++; 1604 1605 sal_uInt16 iNext = iZeroSearch + 1; 1606 if( pBuf[iZeroSearch] == '0' && nLen > iNext && pBuf[iNext] == '.' ) 1607 { 1608 aStr.Erase( iZeroSearch, 1 ); 1609 pBuf = aStr.GetBuffer(); 1610 } 1611 if( !bNeg ) 1612 aStr.Insert( ' ', 0 ); 1613 } 1614 else 1615 aStr.Insert( ' ', 0 ); 1616 } 1617 rPar.Get(0)->PutString( aStr ); 1618 } 1619 } ---snip--- Put a breakpoint on SbRtl_Str (which is what RTLFUNC(Str) mangles the name to), and debugging, line 1587 is true, and line 1594 is false, so a space is unconditionally appended in line 1615. Maybe line 1615 should check for bNeg before adding the space, like lines 1611-1612 do? As for the relationship between Str() and Format(), note that line 1584 calls pArg->Format(). The built-in Format() function in RTLFUNC(Format) also calls the Format() method on its arg. These end up in SbxValue::Format() of main/basic/source/sbx/sbxscan.cxx, and end up converting the double to a string. Yet Str() adds the space after calling Format(). So it's not accurate to say "the Format function works like the Str function". -- You are receiving this mail because: You are the assignee for the issue.
