如何在Sybase SQLAnywhere上使用逗号格式化SQL数字类型?

时间:2016-06-29 01:47:18

标签: sybase sqlanywhere

我遇到了以下解决方案,但它不适用于Sybase

HierarchicalLDA hlda = new HierarchicalLDA();
hlda.initialize(instances, instances, 5, new Randoms());
hlda.estimate(1000);
hlda.printState(new PrintWriter(new File("Data.txt")));

我已阅读Convert Sybase信息,但仍然收到相同号码,但没有逗号。

3 个答案:

答案 0 :(得分:1)

Here is the SP i created based on F Karam suggestion.
CREATE FUNCTION "DBA"."formattednumber"( in @number numeric) 
returns char(60)
begin
  declare @returnnumber char(60);
  declare @workingnumber char(60);
  declare @n_ind char(1);
  declare @decimalnumber char(10);
  declare @tempnumber char(60);
  declare @decimalpos integer;
  if isnull(@number,'') = '' then
    return null
  end if;
  if @number < 0 then set @n_ind = 'Y'
  else set @n_ind = 'N'
  end if;
  set @workingnumber = convert(char(60),ABS(@number));
  set @decimalpos = patindex('%.%',@workingnumber);
  if @decimalpos > 0 then
      set @decimalnumber = substr(@workingnumber,@decimalpos);
      set @decimalnumber = "left"(@decimalnumber,3+1);
      set @workingnumber = "left"(@workingnumber,@decimalpos-1)
    end if end if;
  set @returnnumber = '';

  while length(@workingnumber) > 3 loop

    set @tempnumber = "right"(@workingnumber,3);
    set @returnnumber = insertstr(0,@returnnumber,@tempnumber);
    set @workingnumber = "left"(@workingnumber,length(@workingnumber)-3);
    if length(@workingnumber) > 0 then
      set @returnnumber = insertstr(0,@returnnumber,',')
    end if
  end loop; 
  if length(@workingnumber) > 0 then
    set @returnnumber = insertstr(0,@returnnumber,@workingnumber)
  end if;

  if length(@decimalnumber) > 0 then
    set @returnnumber = @returnnumber+@decimalnumber
  end if;

  if @n_ind = 'Y' then set @returnnumber = '-' || @returnnumber
  end if;
  return(@returnnumber)
end;

答案 1 :(得分:0)

您是否尝试过以varchar(20)为例?类似的东西:

SELECT CONVERT(varchar(20), CAST(987654321 AS money), 1)

在SqlAnywhere中,money数据类型是一个域,实现为NUMERIC(19,4)。

在CAST函数中,如果未指定字符串类型的长度,则数据库服务器会选择适当的长度。如果既没有为DECIMAL转换指定精度也没有指定比例,则数据库服务器会选择适当的值。

所以也许这就是造成这个问题的原因,你得到什么作为输出?你得到987654321.00,还是987654321

更新:

我的最后一个建议是使用insertstr()函数并循环遍历您的数字的char值,每3位数字插入逗号..这不是最干净/最简单的方法,但显然SQLAnywhere处理money数据类型为正常NUMERIC数据类型......

insertstr()文档为here

我会给你一个代码示例,但是我没有安装SQLAnywhere来测试它......

答案 2 :(得分:0)

您需要区分服务器端和客户端格式。例如,当您使用'isql'客户端(TDS客户端)时,结果将是:

1> select convert(money, 9876543210)
2> go
 9876543210
 ------------------------
         9,876,543,210.00

(1 row affected)

但这纯粹是因为客户端应用程序碰巧以这种方式格式化“货币”价值。此外,这实际上并不特定于SQLA,因为isql最初是ASE(不同的Sybase数据库)的客户端工具。

当您在SQLA服务器上运行相同的转换时(即作为SQL语句中表达式的一部分),由于SQLA没有这种内置格式化样式,因此这些逗号不会出现。 如果你想要这个,你应该编写一个SQL函数来根据需要格式化数字。