在 LibreOffice BASIC 中处理大量数据

Posted

技术标签:

【中文标题】在 LibreOffice BASIC 中处理大量数据【英文标题】:Operate with large numbers in LibreOffice BASIC 【发布时间】:2017-11-20 00:27:23 【问题描述】:

我正在尝试操作一个数字的MOD,但它返回溢出数据类型。

此操作有效:

VariableDouble = 2147483647 - (97 * (2147483647 \ 97))
MsgBox VariableDouble

此操作返回错误:

VariableDouble = 2147483648 - (97 * (2147483648 \ 97))
MsgBox VariableDouble

Double 数据类型不应该大于 Long 吗?当然,变量声明如下:Dim VariableDouble As Double

如果我使用内置运算符 MOD:a MOD b,也会发生同样的情况。

我需要对 10 位数字进行运算。有没有办法使用 BASIC 来做到这一点?发生了什么?

【问题讨论】:

【参考方案1】:

我找到了一个解决方案,使我自己的 MOD 实现 [部分] 与迭代 bucle。它有效——不过,我没有使用长度大于 50 位的数字对其进行测试——所以这是代码:

Dim LargeNumber As Double
Dim result As Integer
Dim dividend As Integer
Dim index As Integer

For index = 1 To Len(LargeNumber)
    dividend = result & Mid(LargeNumber, index, 1)
    result = dividend Mod 97
Next

BASIC 似乎无法处理大量数字,尽管它可以将它们保存到变量中。另一种解决方案是在外部调用 Python(API 可以做到这一点)。 Python 很棒,但是我需要为多个系统保持这个数据库的可移植性(有些使用 Windows 操作系统,因此不会预装 Python)。

【讨论】:

这对于 Basic 来说似乎是一个很好的解决方案。但是,正如我的回答中所解释的那样,Python 应该没问题。【参考方案2】:

来自https://wiki.openoffice.org/wiki/Using_Python_on_Windows:“如果您不自定义安装,Python-UNO 桥接器将在最新版本中默认安装。”所以对 Python 的依赖应该是可移植的。

def big_numbers():
    dividend = 12345678901234567890123456789012345678901234567890
    divisor = 97
    modulus = dividend % divisor
    rounded_val = modulus * divisor
    result = dividend - rounded_val
    oDoc = XSCRIPTCONTEXT.getDocument()  # the current Writer document
    oVC = oDoc.getCurrentController().getViewCursor()
    output = ("%d - (%d * (%d \ %d)) = %d\n" %
        (dividend, divisor, dividend, divisor, result))
    oDoc.getText().insertString(oVC, output, False)

g_exportedScripts = (big_numbers,)

请参阅https://wiki.openoffice.org/wiki/Python_as_a_macro_language 了解如何运行此代码。

相关:https://forum.openoffice.org/en/forum/viewtopic.php?t=39854.

【讨论】:

哦,Python的可移植性非常好!我会在下一个脚本中记住它。这对于 LibreOffice 套件来说是一个非常好的点。

以上是关于在 LibreOffice BASIC 中处理大量数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Basic 中计算自己的对数(LibreOffice Calc Macro)

在 LibreOffice 宏的 Basic 中获取文档路径

如何在 libre office basic 中使用模块?

使用 BASIC 在 LibreOffice 中复制表格的最后一行

使用 LibreOffice Basic 迭代控件

如何在 LibreOffice 中使用宏和 Visual Basic 突出显示文本